5

既存のアプリケーションに速度の向上をもたらすことを目指しており、可能なオプションについてのアドバイスを探しています。このアプリケーションはPythonで記述されており、wxPythonを使用しており、パッケージ化されていpy2exeます(私はWindowsプラットフォームのみを対象としています)。アプリケーションの一部は計算集約的であり、解釈されたPythonでは実行が遅すぎます。私はCに精通していないので、コードの一部を移植することは私にとって実際の選択肢ではありません。

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

  • pypyでの実行:今日、私はPypyの実験を開始しました-結果はエキサイティングです。pypyインタープリターからコードの大部分を実行でき、コードを変更せずに5倍以上の速度の向上が見られます。ただし、正しく理解していれば、(a)wxpythonをサポートするPypyはまだ作業中であり、(b)とにかく配布用にexeにコンパイルすることはできません。それで、私が間違っていない限り、これは私にとってはダメのように思えますか?物事をパッケージ化する方法がないので、その一部はpypyで実行されますか?
  • コードをRPythonに変換し、pypyで変換する次のオプションは、実際にはコードの一部をpypy制限言語に書き直すことであるように思われますが、これはかなり大きな仕事のようです。しかし、そうすると、コードの一部を実行可能ファイル(?)にコンパイルして、ctypes(?)を介してコードにアクセスできるようになります。
  • 他の制限されたオプションShedskinはここで人気のある代替手段のようですが、これは私の要件によりよく適合しますか?他のオプションはCpython、Psyco、およびUnladenのようですが、これらはすべて置き換えられるか、保守されなくなります。
4

3 に答える 3

6

PyPyを使用すると、少なくとも1つが移植されるまで、py2exeや同様のツールが除外されます(AFAIKではアクティブな作業はありません)。それでも、PyPyバイナリをインストールする必要がないため、PythonソースコードとPyPyバイナリ+ stdlibの両方を含み、起動を容易にするために小さなラッパー(バッチファイル、実行可能ファイル)を使用するより複雑なディストリビューションで済ますことができます。PyPyのWxPythonが十分に成熟していて使用できるかどうかについてはコメントできませんが、状況を説明していただければ、pypy-dev、wxpython-dev、またはいずれかのIRCチャネルの誰かが推奨を提供できる可能性があります。

コードをRPythonに変換することは、私には実行可能ではないようです。翻訳ツールチェーンは実際には汎用開発用のツールではなく、埋め込み/ctypes用のCdllを作成することは簡単ではないようです。また、RPythonコードは実際には低レベルであるため、Pythonコードを十分に制限すると、その半分が書き直される可能性があります。

その他の制限されたオプションについて:CPython(Cで記述された元のPythonインタープリター)とCython(CPython拡張モジュールに適したCコードを出力するPythonのような言語のコンパイラー)を混同しているようです。どちらのプロジェクトも活発です。私はShedskinにあまり精通していませんが、制限のないPythonコードとの対話がほとんど、またはまったくない、プログラム全体を開発するためのツールのようです。Cythonの方がはるかに適しているようです。非常に優れたパフォーマンスを実現するには、手動の型アノテーションと低レベルのコードが必要ですが、Pythonから使用するのは簡単です。プロジェクトの目的は、拡張モジュールを作成することです。

于 2012-06-09T11:44:11.857 に答える
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

速い、本当に速い。

于 2012-06-09T12:37:55.713 に答える
0

訂正:shedskinは、拡張モジュールだけでなく、プログラム全体を生成するために使用できます。

于 2012-06-11T03:03:26.740 に答える