1. 程式人生 > >python 字典處理的一些坑

python 字典處理的一些坑

問題背景:這兩天用python做大資料處理,抽取每個文字單詞,進行統計排序。資料大概有2000萬個,利用python多程序處理。資料同步用的python多程序通訊中比較常使用的Manager Dict。
原始程式碼是這樣寫的.

def process_file_path_list(self, path_list, total_tf_map):
    for path_ in path_list:
        tf_dict = self.process_file(path_) # extract word in file
        for (key, value) in tf_dict.items():
            # update dict
    		if key in total_tf_map.keys():
    			total_tf_map[key] += value
    		else: 
    			total_tf_map[key] = value


上面這個程式碼跑了一整天才把資料跑完,非常耗時,但是抽取word的程式碼並不是效能瓶頸所在啊,另外按理說使用字典方式進行資料存取也不會太慢啊,但是這貨就是跑了一整天。。。實在受不了了,分析了下原因,原來是這句程式碼導致的。

if key in total_tf_map.keys():


用過python的朋友應該挺熟悉,判斷一個key在不在字典裡,這個方法也挺好用的。但是為啥效能這麼低,按理說python的字典內部實現上是用雜湊表,效能應該挺好的啊。琢磨了半天才發現這裡有個坑,dict.keys()這個函式返回的是一個列表啊,是一個列表。。。處理這麼大的資料,返回出來的列表至少也得有幾十萬個數據,在這些資料裡找key那豈不不是費老大勁了。坑啊。。。
後來程式碼改成:

def process_file_path_list(self, path_list, total_tf_map):
    for path_ in path_list:
        tf_dict = self.process_file(path_)
        for (key, value) in tf_dict.items():
            # update total_tf_dict_
	        if total_tf_map.get(key) != None:
                total_tf_map[key] += value
            else:
		        total_tf_map[key] = value


利用dict的get方法,這個方法是直接利用python雜湊表進行查詢,速度由原來的一天提高到只要半個小時。。。