1. 程式人生 > 其它 >python 節省記憶體的for迴圈技巧

python 節省記憶體的for迴圈技巧

python 記憶體節省的方法

【問題】 程式建立大量(可能上百萬)物件,導致佔用大量記憶體

【方法】

一、建立大量的物件

對於主要當成簡單的資料結構類而言,通過新增__slots__屬性來極大的減少例項所佔用的記憶體
eg:

class Date:
    __slots__ = ['year', 'month', 'day']
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

原理: 定義__slots__

後,python會使用一種更加緊湊的內部表示
例項通過一個很小的固定大小的陣列來構建,而不是為每個例項定義
一個字典,這跟元組或列表很類似。在__slots__中列出得屬性名在
內部被對映到這個陣列的指定小標上。
缺點

不能再給例項新增新的屬性,只能使用__slots中定義的屬性名。
定義了slots後,類不在支援一些普通類特性, 比如多繼承。

二、 python 迴圈記憶體優化之生成器

列印內容位元組數較小時,全部載入記憶體後,再列印,沒有問題。
可是,如果成千上百萬列印資料時,存在out of memory

常用方法 使用itertools模組

1、 拼接元素

itertools中chain()實現元素拼接
list(chain([1,2], [3,4]))

底層程式碼實現:

def chain(*iterables):
    for it in iterables:
        for it element in it:
            yield element

可知,chain 本質上是一個生成器,一次讀入一個元素到記憶體,做到高效節省記憶體

2、逐個累加
返回列表的累積彙總值

參考連線:http://www.360doc.com/content/19/1221/14/21698786_881183436.shtml