dict查1亿次要10秒?
defaultdict + Counter + ChainMap
这3个数据结构让你快100倍
1、自动赋默认值——defaultdict
>>> from collections import defaultdict# 不用 defaultdict:每次要判断键是否存在>>> d = {}>>> for word in ["apple", "banana", "apple", "orange"]:... if word not in d:... d[word] = 0... d[word] += 1... # 用 defaultdict:自动创建默认值>>> dd = defaultdict(int)>>> for word in ["apple", "banana", "apple", "orange"]:... dd[word] += 1... print(dict(dd))... {'apple': 1}{'apple': 1, 'banana': 1}{'apple': 2, 'banana': 1}{'apple': 2, 'banana': 1, 'orange': 1}# 更多用法>>> dd_list = defaultdict(list)>>> dd_list["fruits"].append("apple") # 自动创建空列表>>> print(dd_list)defaultdict(<class 'list'>, {'fruits': ['apple']})
2、统计计数神器——Counter
>>> from collections import Counter# 一行统计词频>>> text = "python java python javascript python java">>> counter = Counter(text.split())>>> print(counter)Counter({'python': 3, 'java': 2, 'javascript': 1})# 最常见的N个>>> print(counter.most_common(2))[('python', 3), ('java', 2)]# 运算>>> c1 = Counter(["a", "b", "a"])>>> c2 = Counter(["a", "c"])>>> print(c1 + c2) # 合计统计 Counter({'a': 3, 'b': 1, 'c': 1})>>> print(c1 - c2) # 扣除统计 Counter({'a': 1, 'b': 1})
3、合并多个字典——ChainMap
>>> from collections import ChainMap# 合并多个字典(不复制,共享内存)>>> defaults = {"theme": "dark", "lang": "en", "page_size": 20}>>> user_overrides = {"lang": "zh", "page_size": 50}>>> config = ChainMap(user_overrides, defaults)>>> >>> print(config["theme"]) # → dark(用defaults)dark>>> print(config["lang"]) # → zh(用user_overrides)zh>>> print(config["page_size"]) # → 50(用user_overrides)50# 增删改只影响第一个映射>>> config["new_key"] = "value" # 只写入user_overrides
4、记住插入顺序——OrderDict
>>> from collections import OrderedDict>>> od = OrderedDict()>>> od["z"] = 1>>> od["a"] = 2>>> od["m"] = 3>>> print(list(od.keys())) # ['z', 'a', 'm'](保持插入顺序)['z', 'a', 'm']# 移动到末尾>>> od.move_to_end("z")>>> print(list(od.keys())) # ['a', 'm', 'z']['a', 'm', 'z']
5、性能对比(defaultdict vs dict)
>>> import timeit# dict(手动判断)>>> t1 = timeit.timeit('''... d = {}... for i in range(10000):... if i not in d:... d[i] = 0... d[i] += 1... ''', number=100)# defaultdict>>> t2 = timeit.timeit('''... from collections import defaultdict... d = defaultdict(int)... for i in range(10000):... d[i] += 1... ''', number=100)>>> print(f"dict: {t1:.4f}s vs defaultdict: {t2:.4f}s")dict: 0.0709s vs defaultdict: 0.0566s
可以看到defaultdict的性能相比dict快25%,性能相当强悍。
-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。