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吧!