Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonコードが関数内でより高速に実行されるのはなぜですか?


Pythonコードを正常に実行し、Python関数で実行すると、後者の場合の方が高速に実行されることがわかります。関数内でPythonコードが高速に実行される理由を知りたい。

一般に、Python関数にグローバル変数よりもローカル変数を格納する方が高速であることがわかります。これは以下のように説明できます。

ローカル/グローバル変数の保存時間は別として、オペコード予測により関数が高速になります。

CPythonは、Python.orgからダウンロードした元のPython実装です。これは、後のPython実装と区別し、言語エンジンの実装をPythonプログラミング言語自体と区別するためにCPythonと呼ばれます。

CPythonはたまたまC言語で実装されています。 CPythonは、Pythonコードをバイトコードにコンパイルし、評価ループでそのバイトコードを解釈します。

関数がコンパイルされると、ローカル変数は固定サイズの配列(dictではなく)に格納され、変数名がインデックスに割り当てられます。これが可能なのは、ローカル変数を関数に動的に追加できないためです。次に、ローカル変数を取得することは、文字通りリストへのポインタールックアップであり、重要ではないPyObjectのrefcountの増加です。

これを、ハッシュなどを含む真のdict検索であるグローバルルックアップと比較してください。ちなみに、変数をグローバルにする場合は、グローバルを指定する必要があるのはこのためです。スコープ内の変数に割り当てる場合、コンパイラは、指示しない限り、アクセスに対してSTORE_FASTを発行します。

ちなみに、グローバルルックアップはまだかなり最適化されています。属性ルックアップは本当に遅いものです!


  1. Pythonのissubset()関数

    この記事では、Python標準ライブラリで利用可能なissubset()関数の実装と使用法について学習します。 issubset()メソッドは、セットのすべての要素が別のセットに存在する場合(引数として渡される場合)はブール値のTrueを返し、それ以外の場合はブール値のFalseを返します。 下の図では、BはAのサブセットです。AとBが同一のセットである場合、AはBの適切なサブセットであることを意味します。これは、両方のセットに同じ要素が含まれていることを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値 boolean True/

  2. Pythonが他の言語より遅いのはなぜですか?

    Pythonはスクリプト言語であり、Cはプログラミング言語です。 C / C ++はPythonに比べて比較的高速です。これは、Pythonスクリプトを実行すると、そのインタープリターがスクリプトを1行ずつ解釈して出力を生成するためですが、Cでは、コンパイラーが最初にスクリプトをコンパイルして、以下に関して最適化された出力を生成します。ハードウェア。 Javaや.NETなどの他の言語の場合、JITコンパイラは実行時にバイトコードをネイティブコードにコンパイルするため、Javaバイトコードと.NETバイトコードはそれぞれPythonよりも高速に実行されます。 Pythonの動的な性質によりJIT