ホームページ  >  記事  >  バックエンド開発  >  問題点: Python [] と list() はどちらが速いですか?なぜ速いのでしょうか?どのくらい速いですか?

問題点: Python [] と list() はどちらが速いですか?なぜ速いのでしょうか?どのくらい速いですか?

coldplay.xixi
coldplay.xixi転載
2020-10-26 18:02:111901ブラウズ

今天Python ビデオ教程 Python の中の微細な知識を大家が解読したものですが、巨大なエネルギーが含まれています。

日常で Python を使用する場合、我们经常创建一列表、相信大家都很熟练了吧?

# 方法一:使用成对的方括号语法list_a = []# 方法二:使用内置的 list()list_b = list()复制代码
上面の二种写法、你经常用哪問題点: Python [] と list() はどちらが速いですか?なぜ速いのでしょうか?どのくらい速いですか?让我们开门见山、本文の问题吧:二種類のリストの [] と 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() にはより多くの実行ステップが含まれるため、[] よりも遅くなります。

3. 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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。