append
は各項目を一度に 1 つずつ追加します。これが速度低下の原因であり、 への関数呼び出しが繰り返されるためappend
です。
ただし、この場合、+=
演算子はのシンタックス シュガーではありません+
。演算子は実際に新しいリストを作成してから割り当て直すの+=
ではなく、左側のオペランドをその場で変更します。timeit
両方とも10,000回使用すると、それはかなり明白です。
>>> timeit.timeit(stmt="l = l + j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.5794978141784668
>>> timeit.timeit(stmt="l += j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.0013298988342285156
+=
はるかに高速です(約500倍)
extend
次のようなもので(別のリストだけでなく)イテラブルを追加できるリストのメソッドもありますl.extend(l2)
>>> timeit.timeit(stmt="l.extend(j)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.0016009807586669922
>>> timeit.timeit(stmt="for e in j: l.append(e)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.00805807113647461
論理的には追加と同等ですが、ご覧のとおりはるかに高速です。
これを説明するには、新しいリスト全体を作成する必要が+
あるため、反復はより高速です+
extend
組み込みのリスト メソッドであり、最適化されているため、反復よりも高速です。繰り返し追加することと論理的に同等ですが、実装が異なります。
+=
extend
リストをその場で変更できるため、リストをどれだけ大きくする必要があるかがわかり、関数呼び出しを繰り返す必要がないため、より高速です。リストに別のリスト/タプルを追加していると想定しています