python 字典处理的一些坑

2017-09-25  本文已影响0人  GThyton

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

上一篇下一篇

猜你喜欢

热点阅读