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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,351评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,478评论 19 139
  • 介绍一下我们 624的兄弟们!航哥:一米八几的个子,家住许昌,记得大一时总是给我们说/呲牙 :许昌的香烟“帝豪”;...
    426bde9d884b阅读 1,937评论 0 0
  • Emmm,虽然这个暑假还没过去,我们直到9.4才开学,但是这个真是个垃圾的暑假了。 从17号开始我就陆陆续续地准备...
    圈圈又青青阅读 721评论 0 1
  • —...
    伊文说阅读 5,889评论 9 11