[英]How To Reduce Python Script Memory Usage
我有一個非常大的python腳本,200K,我想盡可能少使用內存。 它看起來像:
# a lot of data structures
r = [34, 78, 43, 12, 99]
# a lot of functions that I use all the time
def func1(word):
return len(word) + 2
# a lot of functions that I rarely use
def func1(word):
return len(word) + 2
# my main loop
while 1:
# lots of code
# calls functions
如果我把我很少使用的函數放在模塊中,並且只在必要時動態導入它們,我就無法訪問數據。 就我而言,這就是我的意思。
我是python的新手。
任何人都可以把我放在正確的道路上嗎? 如何打破這個大腳本,以便它使用更少的內存? 是否值得將很少使用的代碼放在模塊中,只在需要時調用它們?
Organazing:
您的python腳本似乎確實很大,也許您應該考慮首先重新組織代碼,分成幾個模塊或包 。 它可能會使代碼分析和優化任務變得更容易。
你可能想看看那里:
可能:
優化:
有很多事情可以用來優化你的代碼......
例如,關於您的數據結構......如果您大量使用列表或列表推導,您可以嘗試找出您真正需要列表的位置,以及它們可能被替換為非可變數據結構(如元組或通過“volatile”對象,“懶惰”容器,如生成器表達式。
看到:
在這些頁面上,您可以找到一些有用的信息和提示:
此外,你應該研究你做事的方式,並想知道是否有辦法減少貪婪,這是一種在Python中更好的方法(你會發現pythonic標簽中的一些提示)......特別是在Python中是真的,因為在Python中,通常有一種“明顯”的方式 (並且只有一種)來做比其他方式更好的方法(參見Python的Zen ),據說它是pythonic 。 它與你的代碼的形狀沒有特別的關系,而且最重要的是與表演有關。 與許多語言不同,Python提出了應該有很多方法可以做任何事情的方法,但Python更喜歡只關注最好的方法。 很明顯,有很多方法可以做某事,但通常情況下,一個方法確實更好。
現在,您還應該驗證您是否使用最佳方法來執行操作,因為pythonicality不會為您安排算法。
但最后,它很大程度上取決於你的代碼,如果沒有看到它就很難回答。
關於生成器表達式和使用模塊的建議很好。 過早優化會導致問題,但在開始編寫代碼之前,您應該花幾分鍾時間考慮一下您的設計。 特別是如果該代碼是要重用的話。
順便提一下,你提到你在腳本的頂部定義了很多數據結構,這意味着它們在開始時都被加載到內存中。 如果這是一個非常大的數據集,請考慮將特定數據集移動到單獨的文件,並僅在需要時加載它們。 (使用csv
模塊,或numpy.loadtxt()
等)
與使用較少的內存分開,還要研究更有效地使用內存的方法。 例如,對於大型數值數據集,numpy數組是一種存儲信息的方式,可以在計算中提供更好的性能。 在http://wiki.python.org/moin/PythonSpeed/PerformanceTips上有一些稍微過時的建議
移動函數不會改變您的內存使用情況。 只要導入其他模塊,它就會定義模塊中的所有功能。 但是功能不占用太多內存。 它們是非常重復的,也許你可以通過重構函數來減少代碼嗎?
@ eumiro的問題是對的:你確定你的腳本使用了太多內存嗎? 它使用了多少內存,為什么它太多了?
如果您正在利用OOP並擁有一些對象,請說:
class foo:
def __init__(self, lorem, ipsum):
self.lorem = lorem
self.ipsum = ipsum
# some happy little methods
您可以通過輸入來使對象占用更少的內存:
__slots__ = ("lorem", "ipsum")
就在__init__
函數之前,如圖所示:
class foo:
def __init__(self, lorem, ipsum):
self.lorem = lorem
self.ipsum = ipsum
# some happy little methods
當然,“過早優化是萬惡之源”。 還要在添加之前和之后配置mem使用情況,看看它是否真的有效。 小心破壞代碼(shcokingly),理解這可能最終無法正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.