2011-12-16 11 views
2

私は数百の画像をロードするスクリプトを持って、それらのサイズを変更して、すべての時間は、画像の異なるセットで開始された大きな画像Pypy JITは、スクリプトが1回だけ実行されてもスピードを向上させますか?

を構成:Pypy doesnのとvirtualenvの中にそれを実行

python myscript.py imageFolder/ 

(pypyバージョンはPIL.resizeで多くの時間を費やし、パッケージ初期化ではより少ない時間を費やして、mprofileで〜8秒で実行されます)。

これは、JITが長時間実行されるプロセスに対してのみ有効であるためです。

もしそうなら、スクリプトをデーモンに変換できます(ただし、メモリリークが懸念されます)。

+1

pypyでプロファイルを実行すると、CPythonよりも大きな犠牲になります。プロファイリングなしでパフォーマンスを確認してください。 – fijal

答えて

10

あなたの説明から、PIL.resize()が支配的な操作であるようです。その関数はPythonではなくC言語で書かれています。したがって、私はPyPyがあなたのスクリプトに大きな違いをもたらすと期待することはできません。

高速化を検討している場合は、複数のコアにわたるイメージの読み込みとサイズ変更を並列化することを検討できます。私は通常、Pythonでスレッドを使用することを推奨しません。通常、multiprocessingモジュールを代わりに提案します。しかし、この特定のタスクでは、実際には複数のスレッドがより適しているかもしれません。

+0

+1。 PyPyのJITはPythonコードのみを最適化します(これはもともとPythonでC言語で書かれたものを再実装する理由です)。 –

+1

@ NoufalIbrahim:CPythonの開発では、もともとC言語で記述されたモジュールの場合でも、Pythonでstdlibをすべて作成することを選択しました。既存のC実装はアクセラレータモジュールとしてデフォルトでロードされますが、 Pythonのバージョンは常に利用可能です。 – jsbueno

+1

一般的に、記録のために、JITはシングル実行スクリプトをスピードアップしますか? – Madarco

1

画像を処理するために、スクリプトの処理時間の大部分がPILの画像処理機能の中で費やされることがあります。

これらはネイティブコードで書かれており、既に完全なネイティブスピードで最適化されています - あなたはPythonのコントロールパーツを移動することはほとんどありません。各画像本体の少なくとも10000バイトのファイル名に対応しています)。

さらに高速化が必要な場合は、pypyを忘れてください。マルチコアマシンを使用している場合は、multiprocessモジュールを使用してコードの並列化を試すことができます。

関連する問題