リストの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
おそらくより単純な専用の「単一要素の挿入」機能が非常に遅いのはなぜですか?
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ビットを使用します。
空のリストだけでこれをテストする理由はありますか?
—
MisterMiyagi
@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]