簡體   English   中英

如何減少Python腳本內存使用

[英]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不會為您安排算法。

但最后,它很大程度上取決於你的代碼,如果沒有看到它就很難回答。

並且,請務必考慮eumiroAmr的評論。

這段視頻可能會給你一些好主意: http//pyvideo.org/video/451/pycon-2011---quot-dude--where--39-s-my-ram--quot-

關於生成器表達式和使用模塊的建議很好。 過早優化會導致問題,但在開始編寫代碼之前,您應該花幾分鍾時間考慮一下您的設計。 特別是如果該代碼是要重用的話。

順便提一下,你提到你在腳本的頂部定義了很多數據結構,這意味着它們在開始時都被加載到內存中。 如果這是一個非常大的數據集,請考慮將特定數據集移動到單獨的文件,並僅在需要時加載它們。 (使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM