PythonプログラムをC / C ++コードに変換しますか?[閉まっている]


149

PythonプログラムをC / C ++に変換することは可能ですか?

いくつかのアルゴリズムを実装する必要があります。C/ C ++で実行するときに経験するすべての痛みを正当化するのに十分なパフォーマンスギャップがあるかどうかはわかりません(私は得意ではありません)。私は、1つの単純なアルゴリズムを作成して、そのような変換されたソリューションに対してベンチマークすることを考えました。それだけでPythonバージョンよりもはるかに高速である場合は、C / C ++で実行する以外に選択肢はありません。


32
Pythonがベンチマークで負けているのと同じように、計算がPythonで数秒で終了する場合、50倍または100倍の速度低下は依然として無視でき、大量のI / Oを実行したり、恐ろしいアルゴリズムを使用している場合でも、真実ではありません。「Pythonはどれくらい遅いのですか」と尋ねるのではなく、「Pythonは十分速いですか?」(そしてそれは最も適切なことですが、正直に言えば)-ベンチマークやここでの質問よりも高速です。

1
Pythonでのアルゴリズムの実装は非常に高速で簡単です。単にそれを実行してから、十分に高速かどうかを確認する必要があります。ほとんどの場合、アルゴリズムを最適化してさまざまなデータ構造(リストの代わりにdict / setsなど)またはさまざまな操作を使用して、より高速に実行できます。とにかく、アルゴリズムの最初のドラフトを実装してベンチマーク/プロファイルを行った後で、最適化を行う必要があります。
Bakuriu、2011年

@delnan:私の場合、それはすべて計算時間に関するものです。Cバリアントで必要な時間がx時間少ない場合は、その時間を費やして、アルゴリズムの実行時間を長くします。Pythonがどれほど遅くなるかを(大まかに)調べたいだけです。もし数時間であれば、私が不慣れな言語を使用することはできません(悪い実装の問題に対する最善の解決策を台無しにすることができます: P)。
CrazyFlyingCloseline 2011年

@delnanは、Pythonがおそらく多くのことに対して十分に高速であることについて正しい。速度が遅くても、開発、メンテナンス、将来の拡張の容易さは考慮すべき重要な要素です。
martineau

「x時間」?これはどれくらい大きいですか?実装のベンチマークを行いましたか?測定値はありますか?実装のプロファイルを作成しましたか?または、ソリューションを時期尚早に最適化しようとしていますか?
S.Lott、2011年

回答:


115

はい。Cythonを見てください。それはちょうどそれをします:スピードアップのためにPythonをCに変換します。


6
もちろん、たくさんのcdef宣言を追加して静的型付けを導入しない限り、何も節約できません(そうでない場合は、不透明なPyObject *ものをうまく処理します)。また、通常はPythonとインターフェイスしているため、プレーンCほど高速にはなりません(100%以上?ほとんどの場合、Pythonとのインターフェイスがまったくないプレーンな数値コードの場合のみ!)。しかし、それ以外は、はい、それはあなたのかなりの発明のスピードアップを得ることができます。

7
@delnan:実際、それはあなたに何かを救います。ほとんどの純粋なPythonコードはコンパイル後に高速になります。しかし、はい。cdefsと静的型付けを使用すると、実際に違いが見え始めます。そして、Pythonとのインターフェースは、PythonからCを使用するすべての場合に得られます。
Lennart Regebro、2011年

136

Cバリアントで必要な時間がx時間少ない場合は、その時間を費やして、アルゴリズムの実行時間を長くします。

「投資」はここでは正しい言葉ではありません。

  1. Pythonで動作する実装を構築します。これは、Cバージョンを完了する前に完了します。

  2. Pythonプロファイラーでパフォーマンスを測定します。見つかった問題を修正します。これを実際に正しく行うために、必要に応じてデータ構造とアルゴリズムを変更します。これは、Cの最初のバージョンを完了するずっと前に完了します。

  3. それでも遅すぎる場合は、適切に設計され慎重に作成されたPythonを手動でCに変換します。

    後知恵の仕組みにより、既存のPythonから(既存の単体テストと既存のプロファイリングデータを使用して)2番目のバージョンを実行する方が、Cコードを最初から作成するよりも高速です。

この引用は重要です。

初めての望遠鏡メーカーのためのトンプソンのルール
6インチの鏡を作るよりも、4インチの鏡を作ってから6インチの鏡を作る方が速い。

ビルマッキーナン
ワンインスティテュート


15
途方もないスコアに関係なく、これが質問にどのように答えるかはわかりません。
Audrius Meskauskas

29

Shed Skinは「(制限された)Python-to-C ++コンパイラ」です。


3
シェッドスキンの利点の1つは型の推論です。プログラムフローから変数の型を推測できる場合は、動的な型チェックが回避されます。これにより、通常、C ++コードが短くなり、実際にはより高速なプログラムを読み取ってコンパイルできます。
Kyss Tao

1
そこにもあるのPython→11リットル→C ++ transpiler C ++コンパイラにも制限はPythonで、しかし、それはいくつかのPythonがシェッドスキンでサポートされていない、(例えばネストされた関数/クロージャ)機能をサポートします。
tav

17

ちょうどこれに遭遇しましたハッカーのニュースで新しいツールに。

彼らのページから-「NuitkaはPythonインタープリターの優れた代替品であり、CPython 2.6、2.7、3.2、3.3が提供するすべての構成要素をコンパイルします。これは、PythonをC ++プログラムに変換し、「libpython」を使用して、 CPythonは、非常に互換性のある方法でそうします。」


このプロジェクトは、他の同様のオプションよりもはるかに成熟しています。面白いことに.exe、それは完全に通常のOSX Mach-O実行可能ファイルですが、OSXで拡張機能付きのバイナリを作成します。それのように見えるがために良い代替かもしれませんpyinstallerpy2exepy2app、など--recurse-***のフラグは、しかし、適切に設定することが重要です。
ccpizza

Nuitkaは素晴らしいですが、作成されたC / C ++コードは、CPython-C-code-implementationにバインドするPyObjectを使用しています。慣用的なCコードは生成しません。
Make42

8

別のオプション-ほかに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 ++に積極的にコンパイルしようとします。

このプロジェクトは若いため、バグが発生する可能性があることに注意してください。また、開発チームは非常に友好的であり、バグを数時間で修正する傾向があることにも注意してください。


6

私はこれが古いスレッドであることを知っていますが、役立つと思われる情報を提供したいと思いました。

私は個人的に、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コードが実際に使用されているのか、意味不明なものであるのか、実際には確認していません。幸運を。

お役に立てば幸いです。


2
これは古いコメントですが、ありがとうございます。
kfrncs

問題ありませんでした。便利でした。
jacktrader

PyPy解釈からコンパイルするためにどのソフトウェアを使用しますか?
Vasyl Vaskivskyi

特にPyPyではなく、.pyスクリプトのみです。「C / C ++実行可能ファイル、またはC / C ++ソースコード」が必要な場合はNuitka、実行可能ファイルが簡単な場合はPyInstaller。py2exeもありますが、改善は確かですが、あまり成功しませんでした。PyInstallerは、Windows実行可能ファイル(LinuxおよびMacで動作)だけでなく、クロスプラットフォームでもあります。Nuitkaは、理論上さらに最適化できる使用可能なソースコードを提供する唯一の「コンパイラー」だと思うので、ユニークです。bbFreeze、cx_Freeze、py2appなど、他にもいくつかありますが、まだ試していません。がんばって!
jacktrader

1
また、PyPyはCythonよりも高速に動作することもわかりました。あるテストでは、実際にPyPyがC ++バージョンのプログラム(挿入ソート)と同じ速度であることがわかりました。
Nv7

5

まったく新しいソリューションに対する答えが欠けていることに気づきました。コードでNumpyが使用されている場合、Pythranを試すことをお勧めします。

http://pythran.readthedocs.io/

私が試した機能については、Pythranは非常に良い結果を出します。結果として得られる関数は、書かれたFortranコードと同じくらい高速(またはわずかに遅い)で、(かなり最適化された)Cythonソリューションよりも少し高速です。

Cythonと比較した場合の利点は、Numpy用に最適化されたPython関数でPythranを使用するだけでよいことです。つまり、ループを展開してループ内のすべての変数の型を追加する必要がありません。Pythranは、コードの分析に時間がかかるため、での操作を理解していnumpy.ndarrayます。

また、Numbaやジャストインタイムコンパイルに基づく他のプロジェクト(私の知る限り)では、ループを拡張して本当に効率的にする必要がある場合と比較して、これは大きな利点です。そして、ループを含むコードは、CPythonとNumpyだけを使用すると非常に非効率になります...

Pythranの欠点:クラスがない!しかし、本当に最適化する必要がある関数だけをコンパイルする必要があるので、それほど煩わしくはありません。

別のポイント:Pythranは、OpenMP並列処理を(非常に簡単に)よくサポートしています。しかし、mpi4pyはサポートされていないと思います...


4

http://code.google.com/p/py2c/は可能性のようです-彼らはまた、サイトで言及しています:Cython、Shedskin、およびRPythonは、PythonコードをCよりもはるかに高速な純粋なC / C ++に変換していることを確認します/ C ++はPython API呼び出しでなぞられています。注:まだ試していませんが、試します。


1
Py2Cはまだ未完成のプロジェクトのようです。数年は更新されていないため、機能しなくなっている可能性があります。
アンダーソングリーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.