python 字典处理的一些坑

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
                

用过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
                
单次查询中:看来list 就是O(n)的;而set做了去重,本质应该一颗红黑树(猜测,STL就是红黑树),复杂度O(logn);dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找,其查找复杂其实是O(logn),并不是所谓的O(1)。O(1)只是理想的实现,实际上很多hash的实现是进行了离散化的。dict比set多了一步hash的过程,so 它比set慢,不过差别不大。

so,如果是要频繁的查找,请使用set吧!

转载于:https://www.cnblogs.com/apollo1616/articles/9964928.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值