今天Python ビデオ教程 Python の中の微細な知識を大家が解読したものですが、巨大なエネルギーが含まれています。
日常で Python を使用する場合、我们经常创建一列表、相信大家都很熟练了吧?# 方法一:使用成对的方括号语法list_a = []# 方法二:使用内置的 list()list_b = list()复制代码
注: 問題を明確にするために、分析の例としてリスト テーブルを作成しました。文章
1、 [] は list() の 3 倍快
最初の質問に対して、timeitモジュールの timeit() 関数を使用します単純計算結果:
>>> import timeit>>> timeit.timeit('[]', number=10**7)>>> timeit.timeit('list()', number=10**7)复制代码ログイン後にコピー
上の図に示すように、各自で 10 万回の状況下で、[] 创建方式で 0.47 秒を費やしましたが、list( ) 構築方式要花所要時間 1.75 秒、したがって、後者の所要時間は前者の 3.7 倍です!
注:timeit() 関数の効率実行環境に関連して、毎回の実行結果に若干の誤差が生じる可能性があります。上 [] 速度は list() の 3 倍数点です。
2、list() 比 [] 実行ステップ数
那么、私たちは次の 2 番目のステップを分析します问题:何ですか [] 会はもっと早いですか?今度は
disモジュールの dis() 関数を使用できます。 #>>> from dis import dis>>> dis("[]")>>> dis("list()")复制代码ログイン後にコピー
上の図に示すように、[] のバイトコードには 2 つの命令 (BUILD_LIST および RETURN_VALUE) があり、list() のバイトコードには 3 つの命令 (LOAD_NAME、CALL_FUNCTION、および RETURN_VALUE) があります。
これらの指示は何を意味しますか?それらを理解するにはどうすればよいでしょうか?
まず、[] については、Python のリテラルのセットであり、数値などのリテラルと同様に、正確な固定値を表します。
言い換えると、Python はそれを解析するときに、それがリストを表すことを認識しているため、インタプリタでリストを構築するメソッド (BUILD_LIST に対応) を直接呼び出してリストを作成します。ワンステップで完了します。
list() の場合、「list」は単なる一般名であり、リテラルではありません。つまり、インタプリタは最初はそれを認識しません。
したがって、インタープリタの最初のステップは、名前 (LOAD_NAME に対応する) を見つけることです。各スコープを特定の順序 (ローカル スコープ - グローバル スコープ - 組み込みスコープ) で 1 つずつ検索し、見つからない場合は NameError
をスローします。
インタプリタは、「list」の後に一対のかっこが続いていることを認識します。そのため、2 番目のステップでは、この名前を呼び出し可能なオブジェクトとして呼び出します。つまり、関数 (CALL_FUNCTION に対応) として呼び出します。
したがって、list() がリストを作成するときは、実際にリストの作成を開始する前に、名前検索と関数呼び出しの 2 つのステップを経る必要があります (注: CALL_FUNCTION には、最初の時点でいくつかの関数呼び出しプロセスもあります)。 BUILD_LIST 同じロジックですが、ここでは無視します)。
この時点で、前の質問に答えることができます: list() にはより多くの実行ステップが含まれるため、[] よりも遅くなります。
最初の 2 つの質問の回答プロセスを読んだ後、十分満足できないと感じるかもしれません。この程度の知識を知っていても、あまり役に立たず、微弱な改善には意味がないようです。
しかし、Python Cat
が制作した「なぜ Python なのか」シリーズは、常に知識を求める飽くなき探究心を貫いており、この疑問を未解決のままにすることはできません。
さらに、私の発散思考の癖により、別の興味深い質問も考えました。list() の速度は改善できるでしょうか?
私は少し前にこの問題について説明した記事を書きました。つまり、リリースされたばかりの Python 3.9.0 バージョンでは、list() のより高速な Vectorcall プロトコルが実装されているため、実行速度がある程度は改善されます。
#興味のある学生は、Python 公式 Web サイトにアクセスしてバージョン 3.9 をダウンロードできます。
私の複数ラウンドのテスト結果によると、新しいバージョンで list() を 1,000 万回実行すると約 1 秒かかり、[] の実行にかかる時間の 2 倍になります。データを 2 倍にすると、現在のバージョンでは全体的に大幅に改善されています。
現時点では、一連の質問に回答しています。役立つ内容を見つけた場合は、「いいね!」とサポートをお願いします。今後もさらにエキサイティングなコンテンツにご注目ください。
関連する無料学習の推奨事項: Python ビデオ チュートリアル
以上が問題点: Python [] と list() はどちらが速いですか?なぜ速いのでしょうか?どのくらい速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。