2010-12-18 8 views
4

私はしばらくの間、コマンドラインのPythonスクリプトを書いてきましたが、最近はスピードに本当に不満を感じました。高速応答のコマンドラインスクリプト

私は必ずしも処理速度やタスクや他のコマンドラインツール固有のプロセス(通常は設計/実装上の問題)のディスパッチについては言及していませんが、単に私はツールを実行してヘルプを得るメニューを表示したり、最小限の情報を表示できます。一例として、

、Mercurialは周り0.080scsにあり、GITが0.030scs

である私はMercurialのソースコードに見てきました(それはすべての後にPythonのである)が、答えはまだ見逃さを高速応答スクリプトを持っています私。

私はimportsと考えています。どのようにそれらを管理するかは、初期スローダウンの大きな理由です。しかし、Pythonでコマンドラインスクリプトを高速で高速に処理するための最善の方法はありますか?

OSとoptparseはをインポートし、実行し、単一のPythonスクリプトのmain()これは単に実行するよりも5倍遅い...

を私のマシン上の0.160scsだけで、ヘルプメニューを表示するのにかかるいくつかの引数オプションを解析しますねえ!

編集:

それはCで書かれているように私はgitのを言及しているべきではありません。しかしMercurialの一部はまだ立って、ノー、pycは(少なくとも私には)大きな改善のように感じることはありません。

編集2:怠惰な輸入はMercurialの中にスピードアップするための鍵ですが

、彼らは 通常のPythonスクリプトでの遅さにキーは次のように、それらの中にpkg_resourcesで自動生成されたスクリプトを持っていません。

from pkg_resources import load_entry_point 

pkg_resourcesを使用しないスクリプトを手動で生成した場合は、少なくとも2倍の速度向上が見られるはずです。

ただし、 pkg_resourcesはバージョン依存性の良い方法を提供するので、基本的にはバージョン間の競合を意味しないことを認識していることを確認してください。

答えて

7

Pythonファイルをコンパイルするだけでなく、Mercurialはインポートをオンデマンドで行うように修正しているため、実際に起動時間が短縮されます。それは__builtin__.__import__をdemandimportモジュールのそれ自身のインポート関数に設定します。

あなたが/の/ usr/libに(あるいはどこそれはあなたのマシン上にある)でHGスクリプトを見れば、あなたは次の行で自分のためにこれを見ることができます:あなたはdemandimportを変更した場合

try: 
    from mercurial import demandimport; demandimport.enable() 
except ImportError: 
    import sys 
    sys.stderr.write("abort: couldn't find mercurial libraries in [%s]\n" % 
        ' '.join(sys.path)) 
    sys.stderr.write("(check your install and PYTHONPATH)\n") 
    sys.exit(-1) 

行をpassに変更すると、起動時間が大幅に増加することがわかります。私のマシンでは、ほぼ倍増しているようです。

私はdemandimport.pyを勉強して、あなた自身のプロジェクトで同様のテクニックを適用する方法を知ることをお勧めします。

P.S.私が知っていると確信しているGitはC言語で書かれているので、起動時間が速いことに驚くことはありません。

+0

ここで問題を解決すると思います。私は、Pythonがこれを解決するための "デフォルト"のアプローチがないことに驚いています。簡単に説明してくれてありがとう。 – alfredodeza

0

申し訳ありませんが、確かにあなたを悩ましているのは0.08秒ではありません。ループの中で数百のPythonスクリプトを呼び出す "outter"シェル(または他の言語)スクリプティングを実行しているような気がしますが - これは、これらの起動時間が違いを生む唯一の方法です。だから、あなたの質問にこの重要な情報を控えているか、あなたの父親はthis guyです。

このように外部スクリプトを持っていると仮定して、Pythonプロセスの手続きを呼び出します。この外部スクリプトをPythonで作成し、必要なPythonを同じプロセスでインポートしてそこから実行します。スクリプトの実行ごとに、インタプリタの起動とモジュールのインポートを省略します。

これは、たとえば水銀についても適用されます。 "mercurial"とその中の適切なサブモジュールと呼び出し関数をインポートして、同等のコマンドライン引数と同じアクションを実行することができます

関連する問題