问题背景:这两天用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哈希表进行查找,速度由原来的一天提高到只要半个小时。。。