天天看點

Python中使用自定義類class作為海量資料結構時記憶體占用巨大的問題

最近碰到處理一個二十多兆的檔案時記憶體蹭蹭的吃掉四百多兆,吓死寶寶了。

無奈畢竟接觸python時間有限,還沒有完整的看過python的一些基礎知識,我想一個合格的pythoner應該不會碰到這個問題。當然像我這樣的操作黨碰到的問題映像也更深一點。最郁悶的是網上讨論這個的很有限,google的結果也是三天才找到相應的說明,我想這裡很重要的一點是海量資料在存儲和很低層的操作時并不會使用python,嵌入一個c片段即可。好吧這招我還不會,而且在用的庫要改也是件痛苦的事,為了讓項目盡早上線有個折中的方案頂上即可。在無盡的排查後發現,原來python這個東東為了讓大家寫的爽,在性能上事丢的不要不要的,一般的系統還看不出問題,一但不是它原聲的一些對象問題就來了,原來python在實作很多功能時并不像c那樣極緻,而是丢失性能換來魔法般的靈活性,而這個惡魔就是字典,自定義類的屬性它居然使用字典來實作的。當然python設計時假設class的使用場景并沒有特定于像c的struct那麼高效,好在留了一手,可以像如下添加__slots__來縮減class,使得其占用記憶體更緊湊接近于list,對了list比tuple要差一點,畢竟它功能更多一點,不過我覺得與其省下list這點還不如換c更實在。添加__slots__後的代碼如下:

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

作者:KKcat