通過 memory_profiler
來測試優化前後的程式。
以下是一個記憶體使用量較高的原始程式碼,接著對程式進行優化後,再次使用 memory_profiler
來比較優化前後的記憶體使用情況。
3.11.3
這個範例創建了多個大型列表來模擬高記憶體消耗,並展示如何使用 ,執行時間非常久請小心服用
memory_profiler
來分析每一行程式碼的記憶體使用情況。
from memory_profiler import profile
@profile
def create_large_list():
a = [i for i in range(10**7)] # 大列表佔用大量記憶體
b = [i * 2 for i in a] # 創建另一個大列表
c = a.copy() # 複製列表
return b, c
if __name__ == '__main__':
create_large_list()
a
,然後用它來創建另一個大列表 b
和 c
。這些操作會耗費大量記憶體。memory_profiler
可以查看每一步操作的記憶體增長情況。python -m memory_profiler your_script.py
在這裡,我們將通過一些方法來優化記憶體使用。比如,使用生成器(generator)來避免同時在記憶體中保留多個大型列表。
from memory_profiler import profile
# 使用生成器來優化記憶體
@profile
def create_large_list_optimized():
a = (i for i in range(10**7)) # 使用生成器而不是列表
b = (i * 2 for i in a) # 生成器來避免創建大列表
return b
if __name__ == '__main__':
create_large_list_optimized()
(i for i in range(10**7))
,來取代列表,生成器是惰性評估的,因此不會立即佔用大量記憶體,而是按需生成元素。使用 memory_profiler
來比較優化前後的記憶體使用情況:
-2526.2 MiB
和 -17960.5 MiB
),這是異常的情況。通常,這樣的負數是由於記憶體計算的誤差或者是Python分配和釋放記憶體機制的結果導致的。memory_profiler
讀取記憶體的數據不穩定。