2012-06-09 4 views
5

私は既存のアプリケーションの速度向上を目指しており、可能なオプションについてアドバイスを探しています。このアプリケーションはPythonで書かれており、wxPythonを使用しており、py2exe(私はWindowsプラットフォームのみをターゲットにしています)でパッケージ化されています。アプリケーションの一部は計算量が多く、解釈されるPythonではあまりにも遅く実行されます。私はCに精通していないので、コードの一部を移植することは本当に私の選択肢ではありません。PyPyまたはShedskinを使用して既存のPythonアプリケーションの部分を高速化する

私の質問は、基本的に私が以下に概要を説明しているように私の選択肢の明確なイメージを持っているのですか、それとも間違った方向からアプローチしていますか?

  • pypyで実行:今日は私がPypyの実験を開始した - 結果は、エキサイティングであることに、私はpypyインタプリタからのコードの大部分を実行することができますし、私はコードの変更なしで5倍+スピードの改善を見ています。しかし、私が正しく理解すれば、(a)wxpythonをサポートしているPypyはstill a work in progress、(b)I cannot compile it down to an exe for distribution anywayです。私が間違っていない限り、これは私のために行くもののように思えますか?物をパッケージ化する方法はないので、その部分はpypyで実行されますか?
  • RPythonに変換し、pypyで翻訳する次のオプションは実際にコードの一部をpypyの制限付き言語に書き換えているようですが、かなり大きな仕事のようです。しかし、そうすれば、コードの一部を実行可能ファイル(?)にコンパイルしてから、ctypes(?)でコードにアクセスできます。
  • その他の制限付きオプションシェディスキンがここでよく使われているようですが、これは私の要件に適していますか?他のオプションはCpython、Psyco、Unladenのように見えますが、それらはすべて置き換えられているか、あるいは維持されていません。

答えて

6

PyPyを使用すると、実際にpy2exeやそれに類するツールは、少なくとも移植されるまでは無効になります(AFAIKではこれに積極的な作業はありません)。それでも、PyPyバイナリをインストールする必要がないため、PythonソースコードとPyPyバイナリ+ stdlibの両方を含むより複雑なディストリビューションを使い、小さなラッパー(バッチファイル、実行可能ファイル)を使用して簡単に起動できます。私はPyPy上のWxPythonが使用できるほど成熟しているかどうかについてコメントすることはできませんが、pypy-dev、wxpython-dev、IRCチャンネルの誰かが、

あなたのコードをRPythonに翻訳することは、私にとって実行可能ではないようです。翻訳ツールチェインは、一般的な開発のためのツールではなく、組み込み/ ctypesのためのC DLLを生成することは重要ではないようです。また、RPythonのコードは実際にはと低レベルなので、Pythonコードを十分に制限すると、その半分を書き換えることになります。

その他の制限付きオプション:CPython(Cで書かれた元のPythonインタプリタ)をCython(CPython拡張モジュールに適したCコードを発行するPythonライクな言語のコンパイラ)と混在させているようです。両方のプロジェクトがアクティブです。私はShedskinにはあまりよく慣れていませんが、制限されていないPythonコードとのやりとりがほとんどまたはまったくない、プログラム全体を開発するためのツールのようです。 Cythonははるかに優れているようです:本当に良いパフォーマンスを達成するには手動の注釈と低レベルのコードが必要ですが、Pythonから使用するのは簡単です。プロジェクトの目的は拡張モジュールを作成することです。

+0

ありがとう、私はあなたの答えを受け入れました。しかし、非常に生産的な午後Cythonで遊んだ後、私は克服できない問題を抱えてきたと思う:Cythonのスレッディングサポートの欠如。以前はスレッドで実行され、GUIをロックしていなかった計算量の多い計算は、すべてをフリーズしていました。 グーグルでは、これは設計によるものです。並列処理(http://docs.cython.org/src/userguide/parallelism.html#parallel)を取得することはGILをリリースすることであり、GILのすべてのコードはネイティブのPythonオブジェクトを使用できませんが、これを正しく理解していますか?それはCythonを良くしないだろう。 – misshapen

+0

@NickJ(1)CythonがPythonスレッドをサポートしているかどうかわかりませんが、なぜそれができないのか分かりません。たぶんあなたがリンクしている代替案は、複数のCPUを使用できるため、単に*優先されます*。 (2)これはあなたのタイプミスであるかどうか分かりませんが、GILで保護されているコードはPython型を使用できますが、nogilセクションは使用できません(CPython、したがってすべてのPython型は依存しますGIL)。 (3)それ以外にも、並列化したいものを相対的に純粋なCython関数に入れ、Python経由でスレッドを開始することで、Cythonのスレッド化なしで逃げることができます。 – delnan

3

私は間違いなくCythonを見ています。私はそれをいくつか試してきましたが、純粋なPythonに比べて100倍のスピードアップを見てきました。最初にボトルネックを見つけるには、プロファイルモジュールを使用します。通常、ループはCythonに行くときに速度を上げる最も大きなチャンスです。また、ループの代わりにNumpyで配列/ベクトル演算を使用できるかどうかを調べる必要があります。そうすれば、パフォーマンスが大幅に向上します。たとえば:

a = range(1000000) 
for i in range(len(a)): 
    a[i] += 5 

は遅く、実際は遅いです。一方:

a = numpy.arange(10000000) 
a = a +5 

は速く、本当に速いです。

+0

数字を可能な限りnumpyに移動する場合は+1してください。 – huon

+0

このような大きな配列の場合、+ 5 = – Dhara

0

訂正:シェッドスキンを使用して、拡張モジュールとプログラム全体を生成することができます。

関連する問題