2011-01-10 8 views
90

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

私はいくつかのアルゴリズムを実装する必要があります。パフォーマンスのギャップがC/C++で行っているときのすべての痛みを正当化するのに十分かどうかはわかりませんat)。私は単純なアルゴリズムを1つ書き、そのような変換された解に対してベンチマークを行うことを考えました。それだけでPython版よりもはるかに高速であれば、C/C++で行うよりも他の選択肢はありません。

+24

Pythonがベンチマークを失うのと同じくらい、Pythonで数秒で計算が終了すると、50倍または100倍の減速はまだ無視されます。多くのI/Oを実行したり、恐ろしいアルゴリズム。 「Pythonはどれくらい遅くなっていますか」と尋ねるのではなく、あなたは "Pythonは十分に速いのですか?" (そして、それは最も適切には、正直に言うと) - これはベンチマークや質問よりも速いです。 – delnan

+1

Pythonでアルゴリズムを実装することは、非常に高速で簡単です...単にそれを実行し、それが十分に速いかどうかを確認するだけです。ほとんどの場合、アルゴリズム**を最適化して、異なるデータ構造(リストの代わりにdict/set ...)や異なる操作を使用して、より高速に実行することができます。いずれにしても、アルゴリズムの最初の草案を既に実装し、ベンチマーク/プロファイリングした後、**最適化が行われるべきです。 – Bakuriu

+0

@delnan:私の場合、計算時間はすべてです。 Cのバリアントがx時間を必要としない場合は、アルゴリズムの実行時間を長くすることに時間を費やします。 Pythonがどれほど遅いかを(大雑把に)知りたいだけです。ちょっと時間があれば、私は快適ではない言語を使用しません(悪い実装の問題に対する最良のソリューションを壊す可能性があります: P)。 – CrazyFlyingCloseline

答えて

73

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

+3

もちろん、 'cdef'宣言を追加して静的な型定義を導入しない限り、あなたは何も保存しません(そうでなければ、不透明な' PyObject * 'のものを混乱させるだけです)。そして、それは普通はPythonとインターフェースしているので、決して普通のCと全く同じくらい速くはなりません(100%以上?普通のPythonとはまったくインターフェースしない単純な数値コードのためだけです)。しかし、それ以外にも、それはあなたにかなり邪魔されるスピードアップをもたらすことができます。 – delnan

+4

@delnan:実際には、あなたに何かを保存します。最も純粋なPythonコードは、コンパイル後に高速になります。しかし、はい、cdefsと静的なタイピングでは、実際に違いが見え始めます。また、Pythonとのインターフェースは、PythonからCを使用するすべての場合に得られます。 –

24

Shed Skinは "制限付きPython-to-C++コンパイラ"です。 C変異体が少ないX時間を必要とする場合

+1

Shed Skinの+1利点は、*型推論*です:プログラムフローから変数型を推測することができれば、動的型チェックが回避されます。これにより、通常、より短いC++コードが読み込まれ、より高速なプログラムにコンパイルされます。 –

105

は、その後、私はアルゴリズムが

「投資する」ここで右の単語ではありません長い/再実行させることでその時間を投資すると思います。

  1. Pythonで動作する実装を構築します。あなたはCバージョンを完成させる前にこれを終えるでしょう。

  2. パフォーマンスをPythonプロファイラで測定します。見つかった問題を修正します。実際にこれを正しく行うために、必要に応じてデータ構造とアルゴリズムを変更してください。あなたは

  3. それはまだあまりにも遅いならC.

    の最初のバージョンを終える前に、あなたは、手動で変換長いこれを終了しますうまく設計し、慎重C.

    ための方法後知恵作品の

    へのPythonを構築し、既存のPythonから2番目のバージョンを(既存のユニットテストと既存のプロファイリングデータを使用して)実行することは、Cコードを最初からやってみるよりも速いでしょう。

この見積もりは重要です。

初めての望遠鏡メーカー
6インチのミラーを作ることよりも、4インチのミラー、その後、6インチのミラーを作るために高速であるためトンプソンのルール。

ビルMcKeenan
王研究所

3

http://code.google.com/p/py2c/は、可能性のように見える - 彼らはまた、自分のサイトに言及:Cython、ShedskinとRPythonと、彼らは非常に純粋なC/C++にPythonコードを変換していることを確認しますPython API呼び出しで溢れているC/C++よりも高速です。注:私はそれを試していないが、私は行くつもりです..

8

ちょうどthisハッカーニュースの新しいツールを見つけた。自分のページから

- 「NuitkaはPythonインタプリタのための良い代替であり、すべてがそれはCPython 2.6、2.7、3.2および3.3のオファーを構築コンパイルこれは、その後、使用するC++プログラムにはPythonを変換します。 『で実行するlibpythonを』 CPythonと同じように、非常に互換性のある方法で実装されています。

+0

このプロジェクトは、他の同様のオプションよりもはるかに成熟しています。OSX上で '.exe'拡張子を持つバイナリを作成するのは面白いことですが、それは完全に普通のOSX Mach-O実行ファイルです。 'pyinstaller'、' py2exe'、 'py2app'などの代わりになるかもしれません。' --recurse - ***'フラグは正しく設定することが重要です。 – ccpizza

2

非常に新しい解決策に関する回答が見つからないことを認識しています。numpyのは、コードで使用されている場合は、私がPythranを試してアドバイスう:私が試した機能については

http://pythran.readthedocs.io/

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

Cythonに比べて利点は、Numpyに最適化されたPython関数でPythranを使用するだけです。つまり、ループを拡張してループのすべての変数の型を追加する必要はありません。 Pythranはコードの解析に時間を要し、numpy.ndarrayの操作を理解しています。

Numbaや他のプロジェクトのジャストインタイムコンパイルに比べると大きな利点があります。私の知るところでは、ループを本当に効率的に拡張する必要があります。そして、ループを持つコードは、CPythonとNumpyのみを使用すると非常に非常に非効率になります。

Pythranの欠点:クラスなし!しかし、実際に最適化が必要な機能だけをコンパイルする必要があるため、あまり煩わしいことではありません。

もう一つのポイント:Pythranは、OpenMPの並列処理をうまく(そして非常に簡単に)サポートします。しかし、私はmpi4pyがサポートされているとは思わない。

4

もう1つのオプション - 以外のシェットスキン - はPythranです。ミカGorelickとイアンOzsvaldによって高性能のPythonを引用する

Pythranは、PythonからCへのPythonのサブセットのため++コンパイラ が部分的numpyサポートが含まれていることです。それはNumbaのように動作し、 Cython - 関数の引数に注釈をつけてから、さらに型名とコードの特殊化を伴う を引き継ぎます。ベクトル化の可能性とOpenMPベースの の並列化の利点があります。 Python 2.7のみを使用して動作します。

Pythranの1つの非常に興味深い特徴は、それは(あなたがmapを使用して している場合、例えば)が自動的にスポット並列化の機会を しようとすると、あなたから余分な 労力を必要とせずに、並列コードにこれを有効にすることです。 pragma omp>ディレクティブを使用してパラレルセクションを指定することもできます。この点に関しては、Cythonの OpenMPサポートと非常によく似ています。舞台裏

、Pythranは通常のPythonとnumpyのコード の両方を取り、積極的に非常に高速なC++にコンパイルしようとします - Cythonの結果よりも高速でも 。

このプロジェクトは若いことに注意してください。 のバグが発生することがあります。開発チームは非常にフレンドリーで であり、数時間でバグを修正する傾向があることにも注意してください。

2

これは古いスレッドだとわかっていますが、私は有用な情報だと思っています。

私は個人的にpipを使ってインストールするのが簡単なPyPyを使用します。私はPython/PyPyインタープリタを互換的に使用しているので、コードを変更する必要はまったくなく、標準のPythonインタプリタ(Python 2xまたは3xのいずれか)よりも約40倍高速です。 pyCharm Community Editionを使用してコードを管理しています。

私はPythonでコードを書くのが好きです。言語よりもタスクに集中できるようになると思います。さらに高速化が必要な場合は、Windows、Linux、またはMac用のバイナリにコンパイルすることができます。私の経験から、コンパイルするとPythonに比べて3.5倍の速度が得られます。つまり、Pythonより140倍高速です。 PyPyはPython 3xと2xのコードで利用でき、またPyCharmのようなIDEを使うと、PyPy、Cython、Pythonの間を簡単に交換することができます。

私はこの記事で私と議論する人もいますが、私はPyPyがCythonより速いと感じています。彼らはどちらも素晴らしい選択です。

編集:私はコンパイルについては、別の簡単なメモをしたいのですが:それはそこにすべての依存関係を構築してコンパイルするときは、結果のバイナリは、など、あなたのPythonスクリプトよりもはるかに大きいですが、あなたは、いくつかを取得しますPythonやライブラリがなくても、あなたのコードを難読化し、技術的には「プロダクション」の準備ができています。コンパイラの中には、Cコードを生成するものもあります。これは、実際には見ていないか、または有用であるかちょうど不器用であるかを見ていません。がんばろう。

希望に役立ちます。

関連する問題