10

Python と C++ で (次のように) 空に近い for ループを実行すると、速度が大きく異なり、Python は 100 倍以上遅くなります。

a = 0
for i in xrange(large_const):
  a += 1
int a = 0;
for (int i = 0; i < large_const; i++)
  a += 1;

さらに、python の速度を最適化するにはどうすればよいですか?

(追加:私はこの質問の最初のバージョンでここで悪い例を作りました.C / C ++コンパイラがそれを最適化できるようにa = 1という意味ではありません.ループ自体が多くのリソースを消費したことを意味します.例として a+=1 を使用する必要があります).そして、最適化の方法とは、for ループが += 1 のように単純である場合、どうすれば C/C++ と同様の速度で実行できるかということです。実際、私はNumpyを使用したので、もうpypyを使用できません(今のところ)、ループをはるかに迅速に作成するための一般的な方法はありますか(リストを生成する際のジェネレーターなど)?)

4

4 に答える 4

15

スマートな C コンパイラは、最後に が常に 1 になることを認識して、おそらくループを最適化することができますa。Python はそれを行うことができませxrangeん。python はそれを呼び出すまで副作用があるかどうかを知ることができないため、ループを最適化する方法はありません。この段落から得られるメッセージは、C コンパイラよりも Python の「コンパイラ」を最適化する方がはるかに難しいということです。これは、Python が非常に動的な言語であり、特定の状況でオブジェクトがどのように動作するかをコンパイラが知る必要があるためです。C では、すべてのオブジェクトの型が事前に正確にわかっているため、これははるかに簡単です。__next__xrangeStopIteration__next__

もちろん、コンパイラは別として、Python はさらに多くの作業を行う必要があります。では、ハードウェア命令Cでサポートされている操作を使用して基本型を操作しています。Python では、インタープリターはソフトウェアで一度に 1 行ずつバイトコードを解釈しています。明らかに、機械レベルの命令よりも時間がかかります。また、データ モデル (例:何度も何度も呼び出す) も、C が行う必要のない多くの関数呼び出しにつながる可能性があります。もちろん、Python は、コンパイルされた言語よりもはるかに柔軟にするためにこのようなことを行います。__next__

Python コードを高速化する一般的な方法は、低レベルのコンパイル済みコードへの高レベル インターフェイスを提供するライブラリまたは組み込み関数を使用することです。 この種のライブラリの優れた例ですscipynumpyあなたが調べることができる他のことpypyは、JITコンパイラを含む使用です-おそらくネイティブの速度には達しませんが、おそらくCpython(最も一般的な実装)を打ち負かすか、Cpython-APIを使用してC / fortranで拡張機能を記述しますコードのパフォーマンス クリティカル セクション用の cython または f2py。

于 2013-06-03T14:41:47.510 に答える
0

抽象化すると速度が遅くなります。最も高速なコードは、直接記述されたアセンブリ コードです。

この質問を読んでください。Python プログラムは、C または C++ で記述された同等のプログラムよりも遅いことが多いのはなぜですか?

于 2013-06-03T14:46:40.853 に答える