Python は動的に型付けされ、解釈される言語です。多くの開発者にとって、Python の実行速度が遅いことはよく知られています。すべてがオブジェクトであるという特徴が、Python の実行速度が遅い理由の 1 つです。以下に 3 つの理由があります: Python が遅い理由をさまざまな側面から説明します。
動的型付け
Python は静的に型付けされるのではなく動的に型付けされます。つまり、プログラムが実行されると、インタプリタは変数の型を知りません。 C 言語の場合、コンパイラは変数が宣言されたときに変数の型を認識しますが、Python の場合は、プログラムが実行されたときにのみ、変数が何らかの Python オブジェクトであることを認識します。
次の C コードの場合
int a = 1; int b = 2; int c = a + b;
コンパイラは、a と b が整数であることを常に認識しています。加算演算を実行するときのプロセスは次のとおりです。
Put < int> 1 a
に値を代入
に値を代入 binary_add
結果を c# に代入
# #同じ機能を実現する Python コードは次のとおりです:a = 1 b = 2 c = a + b
Python ビデオ チュートリアル 」
インタプリタは次のことのみを知っています 1と 2 はオブジェクトですが、このオブジェクトのタイプはわかりません。したがって、インタープリターは各変数の PyObject_HEAD をチェックして変数の型を確認し、対応する加算演算を実行し、最後に新しい Python オブジェクトを作成して戻り値を保存する必要があります。一般的なプロセスは次のとおりです: 最初のステップでは、a1 に 1 を割り当てます。a->PyObject_HEAD->typecode を integer2 に設定します。a->val = 1 を設定します。 2 番目のステップ、b1 に 2 を代入します。a->PyObject_HEAD->typecode を整数## を設定します。 #3 番目のステップでは、binary_add
1.a->PyObject_HEAD を呼び出して型エンコーディングを取得します
2.a は整数で、値はは ->val
3.b->PyObject_HEAD は型 encoding
4 を取得します。b は整数で、値は b->val
です5. binary_add
#4 番目のステップは次のとおりです。オブジェクト c
を作成するには1.Set c->PyObject_HEAD->typecode を integer に設定します
2.Set c->val を result
動的型とは、次のことを意味します。どの操作にもさらに多くのステップが必要になります。これが、Python の数値演算が C 言語よりも遅い主な理由です。
Python はインタープリタ型言語です。上記では、インタープリタ型コードとコンパイル済みコードの違いについて説明します。スマート コンパイラは、繰り返される操作や不必要な操作を事前に予測して最適化し、パフォーマンスの向上につながります。コンパイラは大きなトピックなので、ここでは説明しません。
Python のオブジェクト モデルは非効率的なメモリ アクセスをもたらしますC 言語の整数と比較すると、Python には追加の情報層があることを指摘しました。次に、アレイの状況を見てみましょう。 Python では標準ライブラリで提供される List オブジェクトを使用できますが、C 言語ではバッファベースの配列を使用します。 最も単純な NumPy 配列は、C データを中心に構築された Python オブジェクトです。これは、連続したデータ バッファーへのポインターを持っていることを意味します。 Python のリストには連続ポインタ バッファへのポインタがあります。これらの各ポインタは Python オブジェクトを指します。上記の例と組み合わせると、これらの Python オブジェクトは整数オブジェクトになります。この構造は次のようになります。
データを順番にステップ実行する操作を実行している場合、ストレージ コストとアクセス時間の両方の点で、numpy のメモリ レイアウトが Python のメモリ レイアウトよりも効率的であることが簡単にわかります。料金 。
以上がなぜPythonは遅いのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。