PythonプログラムをC/C++に変換できますか?
いくつかのアルゴリズムを実装する必要がありますが、C/C++で実行するときに経験するすべての痛みを正当化するのに十分なパフォーマンスギャップがあるかどうかはわかりません(私は得意ではありません)。単純なアルゴリズムを1つ作成し、そのような変換されたソリューションに対してベンチマークすることを考えました。それだけでPythonバージョンよりも大幅に高速な場合、C/C++で実行する以外に選択肢はありません。
はい。 Cython を見てください。それはまさにそれです:スピードアップのためにPythonをCに変換します。
Cバリアントの必要時間がx時間少ない場合、アルゴリズムをより長く/もう一度実行させるためにその時間を投資します
ここでは「投資」は正しい言葉ではありません。
Pythonで実用的な実装を構築します。これは、Cバージョンを終了するずっと前に終了します。
Pythonプロファイラーでパフォーマンスを測定します。見つかった問題を修正します。本当に適切にこれを行うために、必要に応じてデータ構造とアルゴリズムを変更します。これは、Cで最初のバージョンを完了するかなり前に完了します。
それでも遅すぎる場合は、適切に設計され、慎重に構成されたPythonをCに手動で変換します。
後知恵の仕組みにより、既存のPython(既存の単体テストおよび既存のプロファイリングデータ)から2番目のバージョンを実行することは、Cコードを最初から実行するよりも高速です。
この引用は重要です。
初めての望遠鏡メーカーのトンプソンのルール
6インチミラーを作成するよりも、4インチミラーを作成してから6インチミラーを作成する方が高速です。ビル・マッキーナン
Wang Institute
Shed Skin は「(制限された)Python-to-C++コンパイラ」です。
this ハッカーニュースの新しいツールに出会いました。
彼らのページから-「NuitkaはPythonインタープリターの優れた代替品であり、CPython 2.6、2.7、3.2、および3.3が提供するすべての構成をコンパイルします。PythonをC++プログラムに変換します。次に、「libpython」を使用して、CPythonと同じように、非常に互換性のある方法で実行します。
Shed Skin以外にC++に変換する別のオプションは Pythran です。
Micha GorelickとIan OzsvaldによるHigh Performance Pythonを引用するには:
Pythranは、部分的な
numpy
サポートを含むPythonのサブセット用のPython-to-C++コンパイラです。 NumbaやCythonのように機能します。関数の引数に注釈を付けてから、さらに型注釈とコードの特殊化を引き継ぎます。ベクトル化の可能性とOpenMPベースの並列化の可能性を利用します。 Python 2.7のみを使用して実行されます。Pythranの非常に興味深い機能の1つは、並列化の機会を自動的に見つけて(たとえば、
map
を使用している場合)、余分な労力を必要とせずにこれを並列コードに変換することです。pragma omp
>ディレクティブを使用して並列セクションを指定することもできます。この点で、CythonのOpenMPサポートと非常によく似ています。舞台裏では、Pythranは通常のPythonとnumpyの両方のコードを取得し、Cythonの結果よりもさらに高速に、非常に高速なC++に積極的にコンパイルしようとします。
このプロジェクトは若いため、バグに遭遇する可能性があることに注意してください。また、開発チームは非常に友好的であり、数時間でバグを修正する傾向があることに注意してください。
http://code.google.com/p/py2c/ は可能性のように見えます-彼らはまた彼らのサイトで言及しています:Cython、Shedskin、RPythonはPythonを変換していることを確認します_純粋なC/C++へのコード。これは、Python API呼び出しを使用したC/C++よりもはるかに高速です。注:試したことはありませんが、行っています。
まったく新しい解決策に対する答えが欠けていることに気付きました。 Numpyがコードで使用されている場合、Pythranを試すことをお勧めします。
http://pythran.readthedocs.io/
私が試した機能については、Pythranは非常に良い結果をもたらします。結果の関数は、Fortranコードと同様に高速(またはわずかに遅い)であり、(非常に最適化された)Cythonソリューションよりも少し高速です。
Cythonと比較した利点は、Numpy用に最適化されたPython関数でPythranを使用するだけでよいことです。つまり、ループを展開し、ループ内のすべての変数の型を追加する必要はありません。 Pythranはコードを分析するのに時間がかかり、numpy.ndarray
の操作を理解します。
また、Numbaや、ジャストインタイムコンパイルに基づいた他のプロジェクトと比較して大きな利点です(私の知る限り)、ループを拡張して本当に効率的にする必要があります。そして、ループを含むコードは、CPythonとNumpyのみを使用すると非常に非効率になります...
Pythranの欠点:クラスがない!しかし、本当に最適化する必要がある関数のみをコンパイルする必要があるため、それほど面倒ではありません。
もう1つのポイント:PythranはOpenMPの並列性を(非常に簡単に)サポートしています。しかし、私はmpi4pyがサポートされているとは思わない...
私はこれが古いスレッドであることを知っていますが、役立つと思われる情報を提供したかったのです。
私は個人的に、PIPを使用してインストールするのが本当に簡単なPyPyを使用しています。 Python/PyPyインタープリターを互換的に使用します。コードをまったく変更する必要はありません。標準のpythonインタープリター(Python 2xまたは3x)よりも約40倍高速であることがわかりました。 。私はpyCharm Community Editionを使用してコードを管理し、気に入っています。
pythonでコードを書くのが好きです。言語よりもタスクに集中できると思うからです。これは私にとって大きなプラスです。さらに高速にする必要がある場合は、Windows、Linux、またはMac用のバイナリにいつでもコンパイルできます(簡単ではありませんが、他のツールでも可能です)。私の経験から、コンパイル時のPyPyの速度は約3.5倍になります。これは、Pythonよりも140倍速いことを意味します。 PyPyはPython 3xおよび2xコードで利用できます。PyCharmのようなIDEを使用する場合、PyPy、Cython、およびPythonを簡単に交換できます(少しの初期学習が必要です)とセットアップ))。
一部の人々はこれについて私と議論するかもしれませんが、PyPyはCythonよりも高速であると思います。しかし、どちらも素晴らしい選択肢です。
編集:コンパイルについて別の簡単なメモをしたい:コンパイルすると、結果のバイナリはpythonスクリプトよりもはるかに大きくなります。次に、いくつかの明確な利点が得られます。速度!、Pythonまたはライブラリなしでアプリがすべてのマシンで動作するようになりました(すべてではありませんが、コンパイルしたOSによって異なります)。技術的に「生産」準備完了(ある程度)。一部のコンパイラはCコードも生成しますが、Cコードが有用であるか、単に意味がわからない場合は、実際に見たり見たりしていません。がんばろう。
お役に立てば幸いです。