簡體   English   中英

如何避免對Python 2.7類實例進行深度復制?

[英]How to avoid deepcopy of Python 2.7 class instances?

我正在運行一種進化算法,以在單獨的仿真環境(也用Python編寫)中優化功能。 仿真環境本身是python類實例,並且計算量大(每次運行約4秒),並占用大約1Gb的內存。 由於要在此仿真環境中生成約十萬種不同的功能進行測試,因此我需要一種方法來盡可能多地離線進行仿真。

我所能做的是預先計算大部分模擬(即初始化類的實例,然后運行類函數的子集),然后僅針對較小的組件(例如,內部剩余的幾個函數)觸發算法班級)。 通常,這將評估時間減少到〜1秒,從而顯着提高了運行時間。

但是,每次將新函數傳遞到模擬類實例時,該類實例都會被函數更改(從而影響下一個函數評估的結果)。 我可以通過在每次評估之前對整個類實例進行深度復制來防止這種情況的發生,但這最終比每次運行整個模擬都要慢。

有沒有一種方法可以避免在每個階段對整個類進行深度復制,而獲得相同的結果? 本質上,每個函數評估都需要在完全相同的類實例上執行。

謝謝

所以事實證明,這個問題是Python的Multiprocessing.Pool類的問題(我沒有提到它,因為我認為這不是問題的一部分)。 默認情況下,池中的每個工作進程都將在池打開的整個時間內生存。 由單個工作程序執行的所有進程隨時都保留在內存中,並且由於將單個類實例傳遞給那些工作程序,因此每次執行解決方案時都會更新該類實例。 解決此問題的簡單方法是使用Multiprocessing.Pool的“ maxtasksperchild”參數來限制單個工作程序在被殺死並在其位置上產生之前可以處理的任務數。 將此值設置為1已解決了我所有的問題。

這不能直接解決您正在演變的類的問題,但是我對於保存類實例的cPickle性能有很好的經驗。 我用它來保存自定義數據結構的狀態,該狀態非常大,並且加載和保存是非常快速的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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