使用列表的 insert
函数比使用切片赋值实现相同效果要慢得多:
> python -m timeit -n 100000 -s "a=[]" "a.insert(0,0)"
100000 loops, best of 5: 19.2 usec per loop
> python -m timeit -n 100000 -s "a=[]" "a[0:0]=[0]"
100000 loops, best of 5: 6.78 usec per loop
(请注意,
a=[]
只是准备工作,因此a
最初为空,但随后增加到100,000个元素。)起初我以为可能是属性查找或函数调用开销等原因,但在接近结尾处插入元素时发现这是可以忽略不计的:
> python -m timeit -n 100000 -s "a=[]" "a.insert(-1,0)"
100000 loops, best of 5: 79.1 nsec per loop
为什么那个看起来更简单的专用“插入单个元素”函数会慢得多?
我也可以在repl.it上重现它:
from timeit import repeat
for _ in range(3):
for stmt in 'a.insert(0,0)', 'a[0:0]=[0]', 'a.insert(-1,0)':
t = min(repeat(stmt, 'a=[]', number=10**5))
print('%.6f' % t, stmt)
print()
# Example output:
#
# 4.803514 a.insert(0,0)
# 1.807832 a[0:0]=[0]
# 0.012533 a.insert(-1,0)
#
# 4.967313 a.insert(0,0)
# 1.821665 a[0:0]=[0]
# 0.012738 a.insert(-1,0)
#
# 5.694100 a.insert(0,0)
# 1.899940 a[0:0]=[0]
# 0.012664 a.insert(-1,0)
我在Windows 10 64位系统上使用Python 3.8.1 32位版本。
而repl.it则在Linux 64位系统上使用Python 3.8.1 64位版本。
a=[1,2,3];a[100:200]=[4]
将4
添加到列表a
的末尾,这很有趣。 - Ch3steRpython3.8 -m timeit -n 100000 -s "a=[]" "a.insert(-1,0)"
方面速度更快。也许 What’s New In Python 3.8 可以帮助您深入了解这个问题。 - fabianeglia=[]; a[0:0]=[0]
进行基准测试,或者a[0:0]=[0]
与a[100:200]=[0]
相同... - Kelly Bundy