2016-08-14 6 views
3

私はPython 3.Xのドキュメントを読んでいますが、リスト理解の実行速度と正確に動作する方法については疑問があります。List ComprehensionはPythonでどのように正しく動作しますか?

のは、次の例みましょう:これは新しいリストを返す私の知識で今

リスト1

... 
L = range(0,10) 
L = [x ** 2 for x in L] 
... 

を、そしてそれが書き留めて同等です:

リスト2

... 
res = [] 
for x in L: 
    res.append(x ** 2) 
... 

主な違いは、私が正しい場合、実行の速度です。リスト1はインタープリタ内でC言語の速度で実行されるはずですが、リスト2はそうではありません。

しかし、リスト2は、リスト1は、インタプリタ&リスト内のCの速度で実行されている理由2がではないので、リスト内包表記は(ないことを確認)内部的に何ですか?どちらも処理される前にバイトコードに変換されるか、何か不足していますか?

+2

_bothは処理される前にバイトコードに変換されています_はい、そうですか?彼らは同じバイトコードに変換されないので、なぜ彼らは同じ時間を取る必要がありますか? –

+1

@ŁukaszRogalskiは、リストの理解が内部的に何をしているのか2を挙げていませんか?その場合、同じバイトコードに変換する必要があります。 – Sid

+1

リスト内包表記の主な目的は、複雑なリストの作成を簡素化し、ワンライナーへの可読性を向上させることです。コンパイルされたバイトコード 'pyc'に違いがあるかどうかを比較することができます。Pythonのソースコードが公開されているので、Cを読んだら、リストの理解に対応するアルゴリズムを読むことができます。 – noumenal

答えて

3

実際に生成されるバイトコードを見てください。私は2つのコード断片をf1とf2というfuctionsに入れました。

理解は、この処理を行います。

3   15 LOAD_CONST    3 (<code object <listcomp> at 0x7fbf6c1b59c0, file "<stdin>", line 3>) 
      18 LOAD_CONST    4 ('f1.<locals>.<listcomp>') 
      21 MAKE_FUNCTION   0 
      24 LOAD_FAST    0 (L) 
      27 GET_ITER 
      28 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      31 STORE_FAST    0 (L) 

お知らせがバイトコードにはループがありません。ループは、今、このforループし

C.

で起こる:理解とは対照的に

4   21 SETUP_LOOP    31 (to 55) 
      24 LOAD_FAST    0 (L) 
      27 GET_ITER 
     >> 28 FOR_ITER    23 (to 54) 
      31 STORE_FAST    2 (x) 
      34 LOAD_FAST    1 (res) 
      37 LOAD_ATTR    1 (append) 
      40 LOAD_FAST    2 (x) 
      43 LOAD_CONST    3 (2) 
      46 BINARY_POWER 
      47 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      50 POP_TOP 
      51 JUMP_ABSOLUTE   28 
     >> 54 POP_BLOCK 

は、ループは、バイトコードに明確にここにあります。したがって、ループはPythonで発生します。

バイトコードが異なっていて、最初の方が高速です。

+0

はい、それです!私はちょうどあなたとLukaszによって提案されたバイトコードをチェックして、同じ結果を得ました。実際には、2つのリストは同じであり、リストの理解はL2と同じですが、Cでは明らかに速く、ほぼ2倍です。もう一度ありがとう! – Sid

3

答えは実際にあなたの質問にあります。

ビルド済みのPython関数を実行すると、C言語で書かれたものがマシンコードにコンパイルされて実行されます。

独自のバージョンを書くときは、そのコードをインタプリタによって処理されるCPythonオブジェクトに変換する必要があります。

したがって、組み込みのアプローチまたは関数は、独自の関数を記述するよりも、Pythonではいつもより速く(またはより少ないスペースで)行われます。

関連する問題