Hacker News | 📄 原文链接 | 2026-09-11 收录

Python 的 set 与 dict 并非 O(1):构造得当可退化成二次时间

来源:lemire.me — lemire.me · 25 分 · by ibobev

📋 概述

Daniel Lemire 用极短的代码打破常识:取 M = 2^61 − 1,令 values = [i × M],先插入 set,再逐个判断是否在集合里。如果哈希表真是常数时间,整个过程应接近线性;实测在 Apple M4 Max + Python 3.14 上,n 每翻一倍耗时约翻四倍——n = 16000 时建集合 1072 毫秒、成员检查 1066 毫秒,十万元素建集合要 45 秒。原因既有哈希冲突,也有缓存效应:大 dict 里键、字符串与整数对象每键约占 116 字节,查找频繁错过缓存;同样的字符串到整数查询,dict 从 22 纳秒/键恶化到 202 纳秒/键(九倍),而面向不可变映射的 fastconstmap 每键只需 9 字节,维持在 4–12 纳秒。结论是「O(1)」只是模型而非现实,而模型会给我们带来认知偏差。

🔑 核心要点

💡 金句

说哈希表是 O(1) 只是模型——模型很有用,但没有一个是现实。
← 返回 Hacker News 首页