使用列表的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位上使用32位Python 3.8.1。
repl.it在Linux 64位上使用Python 3.8.1 64位。
有什么理由为什么只用一个空列表进行测试?
—
MiyaMiyagi
@MisterMiyagi好吧,我必须从一些开始。请注意,它仅在第一次插入之前为空,并在基准测试期间增长到100,000个元素。
—
堆溢出
@ smac89
—
Ch3steR
a=[1,2,3];a[100:200]=[4]
附加4
到列表的结尾a
很有趣。
@ smac89虽然这是真实的,它并没有真正有问题的做,我担心这可能会误导人进入以为我标杆
—
堆溢出
a=[]; a[0:0]=[0]
或a[0:0]=[0]
不相同的a[100:200]=[0]
...
a=[]; a[0:0]=[0]
它与a=[]; a[100:200]=[0]