[] と list() の違い
Pythonでリストを生成する際、[] と list() の2つの方法がありますが、これらには速度の違いがあります。[] はリテラル構文で、Pythonはリストを生成するための専用命令(BUILD_LIST)を使います。一方、list() は関数呼び出しが必要で、その過程でグローバル名前空間やビルトインモジュールの検索が行われ、余分なオーバーヘッドが生じます。
リテラル構文と関数呼び出しの違い
リテラル構文である [] は、Pythonがリストオブジェクトを迅速に生成するための最適化が行われており、関数呼び出しが不要です。これに対して、list() はまず関数として解決され、その後に実行されるため、LOAD_NAME や CALL_FUNCTION などの追加処理が発生します。
Pythonバイトコードの違い
import dis
dis.dis('[]') # BUILD_LIST 0
dis.dis('list()') # LOAD_NAME, CALL_FUNCTION
[] は BUILD_LIST という簡単な命令のみで処理が完結しますが、list() は名前解決と関数呼び出しを伴うため、処理が複雑です。この違いが [] の方が速い理由です。
実際の速度比較
以下のコードを timeit で実行すると、明確な差が確認できます。
import timeit
print(timeit.timeit('[]', number=10000000)) # 約0.3秒
print(timeit.timeit('list()', number=10000000)) # 約1.0秒
これにより、[] が list() よりも大幅に速いことが分かります。これは特にリストを何度も生成するような場面で重要です。
結論
Pythonでリストを作成する際、パフォーマンスが重要な場合は [] を優先的に使用することが推奨されます。list() の方が柔軟性がありますが、その分、関数呼び出しによるオーバーヘッドが発生します。