ホームページ  >  記事  >  バックエンド開発  >  なぜPythonは遅いのか

なぜPythonは遅いのか

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-06-25 16:07:502897ブラウズ

Python は動的に型付けされ、解釈される言語です。多くの開発者にとって、Python の実行速度が遅いことはよく知られています。すべてがオブジェクトであるという特徴が、Python の実行速度が遅い理由の 1 つです。以下に 3 つの理由があります: Python が遅い理由をさまざまな側面から説明します。

なぜPythonは遅いのか

動的型付け

Python は静的に型付けされるのではなく動的に型付けされます。つまり、プログラムが実行されると、インタプリタは変数の型を知りません。 C 言語の場合、コンパイラは変数が宣言されたときに変数の型を認識しますが、Python の場合は、プログラムが実行されたときにのみ、変数が何らかの Python オブジェクトであることを認識します。

次の C コードの場合

int a = 1;
int b = 2;
int c = a + b;

コンパイラは、a と b が整数であることを常に認識しています。加算演算を実行するときのプロセスは次のとおりです。

Put c1d486739592e19159663e7144ffa124 1 a

に値を代入 4bfbd77b26a27f8d06ee2a2e2da7455b(a, b)

結果を c# に代入

# #同じ機能を実現する Python コードは次のとおりです:

a = 1
b = 2
c = a + b

関連する推奨事項: 「

Python ビデオ チュートリアル

インタプリタは次のことのみを知っています 1と 2 はオブジェクトですが、このオブジェクトのタイプはわかりません。したがって、インタープリターは各変数の PyObject_HEAD をチェックして変数の型を確認し、対応する加算演算を実行し、最後に新しい Python オブジェクトを作成して戻り値を保存する必要があります。一般的なプロセスは次のとおりです:

最初のステップでは、a

1 に 1 を割り当てます。a->PyObject_HEAD->typecode を integer

2 に設定します。a->val = 1

を設定します。 2 番目のステップ、b

1 に 2 を代入します。a->PyObject_HEAD->typecode を整数


2 に設定します。b->val = 2

## を設定します。 #3 番目のステップでは、binary_add4101e4c0559e7df80e541d0df514fd80(a, b)

1.a->PyObject_HEAD を呼び出して型エンコーディングを取得します

2.a は整数で、値はは ->val

3.b->PyObject_HEAD は型 encoding

4 を取得します。b は整数で、値は b->val

です5. binary_add4101e4c0559e7df80e541d0df514fd80(a->val, b->val)

#6 を呼び出します。結果は整数で、result に格納されます

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。