最近碰到處理一個二十多兆的文件時內存蹭蹭的吃掉四百多兆,嚇死寶寶了。
無奈畢竟接觸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