You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何bytearray中b.pop(0)比del b[0]慢200余倍?

为什么bytearray的pop(0)比del b[0]慢这么多?

我们对bytearray的pop(0)和del b[0]做了三轮性能测试,每轮执行一百万次操作,测试代码如下:

from timeit import timeit

for _ in range(3):
    t1 = timeit('b.pop(0)', 'b = bytearray(1000000)')
    t2 = timeit('del b[0]', 'b = bytearray(1000000)')
    print(t1 / t2)

三轮测试的时间比值(pop(0)耗时 ÷ del b[0]耗时)如下:

274.6037053753368
219.38099365582403
252.08691226683823

可以看到pop(0)的耗时是del b[0]的200倍以上。

核心原因:操作逻辑的本质差异

虽然两者都会移除bytearray的第一个元素并将后续元素前移,但pop(0)比del b[0]多了两个关键开销点:

  1. 返回被删除元素:pop()方法需要先取出索引0处的元素,保存后用于返回;而del语句只负责删除元素,不需要处理返回值,少了数据拷贝和传递的步骤。
  2. 通用方法的额外逻辑:pop()是序列类型的通用方法,需要处理空序列的异常抛出,同时支持任意索引参数;而del b[0]的实现更聚焦于单个索引的删除场景,逻辑更简洁,没有多余的分支判断和函数调用开销。

从CPython底层实现来看:

  • bytearray的del操作直接调用PyByteArray_DelItem函数,针对单个索引删除做了优化,元素移动的逻辑紧凑高效。
  • pop()方法则需要先通过序列的sq_item接口获取目标元素,再执行删除逻辑,中间多了数次函数调用和数据传递的开销,这些累积起来就造成了两者巨大的性能差距。

内容的提问来源于stack exchange,提问作者Kelly Bundy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:41:03