为何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]多了两个关键开销点:
- 返回被删除元素:
pop()方法需要先取出索引0处的元素,保存后用于返回;而del语句只负责删除元素,不需要处理返回值,少了数据拷贝和传递的步骤。 - 通用方法的额外逻辑:
pop()是序列类型的通用方法,需要处理空序列的异常抛出,同时支持任意索引参数;而del b[0]的实现更聚焦于单个索引的删除场景,逻辑更简洁,没有多余的分支判断和函数调用开销。
从CPython底层实现来看:
bytearray的del操作直接调用PyByteArray_DelItem函数,针对单个索引删除做了优化,元素移动的逻辑紧凑高效。pop()方法则需要先通过序列的sq_item接口获取目标元素,再执行删除逻辑,中间多了数次函数调用和数据传递的开销,这些累积起来就造成了两者巨大的性能差距。
内容的提问来源于stack exchange,提问作者Kelly Bundy
相关产品推荐
相关产品推荐

