让它们竞争三次(每次一百万次弹出/删除):
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)
时间比例(在线尝试!):
274.6037053753368
219.38099365582403
252.08691226683823
为什么
pop
执行相同操作的速度要慢那么多?
.pop()
函数至少涉及一个赋值操作,但是它的区别非常显著。 - roganjoshpop()
必须返回该值有关,因此它必须进行引用计数并且还要转换返回值。在 Python 中进行属性访问需要很长时间 (b.pop
--> 查找属性,然后调用是昂贵的,但可以通过pop = b.pop
进一步改进),而使用del
则只需一个单独的字节码指令即可。 - Ashwini Chaudharypop(0)
与b[0]; del b[0]; b.pop
的区别仍然超过了100(参见https://tio.run/##dYxBDgIhDEX3c4rugMQozGyME09ijIHIKIlA03TD6RGFhRv/pv3ty8PCz5yWI1KtG@UIHKIPDCFiJh5tmrZMcIOQgGx6eLmo0wQtbOA8GCkwo9RK7EC4dnWFvSWyRRr9jVqhEZ/Pvk2humD@EbiLvq5w9y/oWwf/@oYCKSSWbA48q1rf)。 - Kelly Bundy