list.insert(0, x) 在大列表上极慢,因其底层为动态数组,需将所有元素后移一位,时间复杂度为 O(n);实测 10 万元素插入 1000 次耗时约 1.8 秒,远慢于 append(0.0012 秒)和 deque.appendleft(0.0015 秒)。
list.insert(0, x) 在大列表上慢得离谱因为 Python 的 list 底层是动态数组,insert(0, x) 必须把原有全部元素往后平移一位——10 万个元素就要移动 10 万次内存地址。这不是“有点慢”,而是 O(n) 时间复杂度

在典型机器上(Python 3.11,i5-8250U):
list.insert(0, x):约 1.8 秒list.append(x):约 0.0012 秒collections.deque.appendleft(x):约 0.0015 秒差距不是数量级差异,而是「秒级 vs 毫秒级」。一旦涉及循环插入、日志前缀追加、解析器 token 前置等场景,很容易卡住主线程。
别只记「用 deque」,要按场景选:
collections.deque,appendleft() 和 popleft() 都是 O(1)lst[5] 或切片)→ 改用 lst = [x] + lst(小数据可接受),或反向构建再 reversed()(适合一次性前置多条)append(),最后统一 lst.reverse(),避免每次插入都搬数组deque 积累,完成后再转 list(deq)(仅一次拷贝)deque 看似完美,但要注意:
d[1:5] 报 TypeError),需转 list(d)[1:5](代价高)d[10000] 会从头遍历,比 list 慢百倍deque 不是线程安全的,多线程写入仍需 threading.Lock
真正的优化起点,不是换数据结构,而是先问一句:这个“插入开头”的逻辑,是不是可以变成“追加末尾 + 最后翻转”?很多 parser 和 builder 场景其实可以倒着写。