当前位置:首页>python>Python字典底层原理:一个函数让查询速度提升100倍

Python字典底层原理:一个函数让查询速度提升100倍

  • 2026-10-11 08:08:45
Python字典底层原理:一个函数让查询速度提升100倍

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%,性能相当强悍。

☆☆☆ End ☆☆☆转角  ·  遇见  ·  程序猿
-------------------------
那是一抹淡淡的微光

它是数字世界里的一把杀猪刀

却总能巧夺天工

它的世界是纯粹0、1组合

却总能创造无尽幻想

......

本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。

最新文章

随机文章