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

なぜPythonは遅いのでしょうか?

青灯夜游
青灯夜游オリジナル
2019-05-22 14:54:122302ブラウズ

Python は動的に型付けされ、解釈される言語です。多くの開発者にとって、Python の実行速度が遅いことはよく知られています。すべてがオブジェクトであるという特性が、実行速度が遅い理由の 1 つです。次の記事で説明しています。 Python が遅い理由をいくつか説明します。お役に立てれば幸いです。

なぜPythonは遅いのでしょうか?

#Python は静的言語ではなく動的言語です

つまり、Python プログラムが実行されると、コンパイルされます。コンパイラーは変数の型を認識しません。 C では、コンパイラは変数が定義されたときに変数の型を認識しますが、Python ではそれがオブジェクトであることは実行されたときにのみ認識されます。

したがって、C で次のように記述するとします。

/ * C代码* /
int  a  =  1 ;
int  b  =  2 ;
int  c  =  a  +  b ;

C コンパイラは、a と b が整数であることを最初から知っています。単に、それらが他の整数であることはあり得ません。この知識があれば、2 つの整数を加算し、メモリ内の単純な値である別の整数を返すルーチンを呼び出すことができます。

C で実行される処理は大まかに次のとおりです:

1. 1 を a に代入;

2. 2 を b に代入;

3. バイナリ加算の呼び出し binary_add(a, b)(a, b);

4. 構造体を C 変数に代入

python有効なコードは次のとおりです。

# python code
a = 1
b = 2
c = a + b

ここで、インタプリタは 1 と 2 がオブジェクトであることだけを知っていますが、それらがどのようなタイプのオブジェクトであるかは知りません。したがって、インタプリタは各変数の PyObject_HEAD をチェックして型情報を見つけ、両方の型に適切な合計ルーチンを呼び出す必要があります。最後に、戻り値を保持するために新しい Python オブジェクトを作成して初期化する必要があります。


実行プロセスは大まかに次のとおりです:

1.

に 1 を代入 (1) a->PyObject_HEAD->typecode を a->PyObject_HEAD->typecode に設定しますinteger

(2) Seta->val = 1

2 を設定し、b

に 2 を代入します (1) b->PyObject_HEAD->typecode をinteger

(2) b->val = 2

3 を設定します。バイナリ加算を呼び出します binary_add(a, b)

(1) 型コード a- を見つけます>PyObject_HEAD

(2) a は整数、値は a->val

(3) 型コードを検索します b->PyObject_HEAD

( 4) b は整数、値は b ->val

(5) バイナリ加算を呼び出す binary_add(a->val, b->val)

(6)結果は result であり、整数です。

4. 新しいオブジェクトを作成します c

(1) c->PyObject_HEAD->typecode を整数に設定します

(2) c->val を割り当てます結果

動的型付けでは、どの操作にもより多くの手順が必要であることを意味します。これが、数値データ操作に関して Python が C よりも遅い主な理由です。

Python はコンパイル言語ではなくインタープリタ言語です

インタープリタ言語とコンパイル言語の違いは、プログラムの実行速度にも違いをもたらします. .インテリジェントなコンパイラーは、反復的で不必要な操作を予測して最適化できます。これにより、プログラムの実行速度も向上します。

Python のオブジェクト モデルは非効率的なメモリ アクセスをもたらします

上記の例では、C 言語と比較して、Python で整数を操作すると、型情報の層が追加されます。 。整数がたくさんあり、何らかのバッチ操作を実行したい場合、Pythonではリストがよく使用され、Cではバッファベースの配列が使用されます。最も単純な形式では、Numpy 配列は C の配列を中心に構築された Python オブジェクトです。つまり、Numpy は連続キャッシュ領域データの値を指すポインタを持ちますが、Python では Python リストにはその領域をキャッシュしたいだけのポインタがあり、各ポインタは Python キャッシュ オブジェクトを指し、各オブジェクトはデータ (この場合は整数) にバインドされます。

これら 2 つの状況の概略図:

なぜPythonは遅いのでしょうか?

上の図から明らかなように、データを操作するとき (並べ替え、計算、検索など)、 , など)、生存コストとアクセスコストの点で、Numpy は Python よりも効率的です。

以上がなぜPythonは遅いのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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