2013-05-04 42 views
21

Pythonモジュールの読み込み速度を上げる方法は、以前に(Speeding up the python "import" loaderPython -- Speed Up Imports?)尋ねられましたが、具体的な例はなく、受け入れられた解決策はありませんでした。私はここで再び問題を取り上げますが、今度は具体的な例を挙げます。Pythonモジュールのインポート速度を向上させる

私はディスクから3D画像スタックを読み込み、滑らかにしてムービーとして表示するPythonスクリプトを用意しています。データをすばやく表示するには、システムのコマンドプロンプトからこのスクリプトを呼び出します。これはMATLABに匹敵するので、データを円滑にするために必要な700ミリ秒でOKです。ただし、モジュールをインポートするにはさらに650ミリ秒かかります。したがって、ユーザーの観点から、Pythonコードは半分のスピードで実行されます。

これは私が輸入していたモジュールのシリーズです。もちろん

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import scipy.ndimage 
import scipy.signal 
import sys 
import os 

を、いないすべてのモジュールをインポートする均等に遅いです。主犯は以下のとおりです。

matplotlib.pyplot [300ms] 
numpy    [110ms] 
scipy.signal  [200ms] 

私はfromを使って実験してきたが、これはどの速くはありません。 Matplotlibが主な原因であり、スクリーンの更新が遅いという評判があるので、私は代替案を探しました。 1つはPyQtGraphですが、インポートには550ミリ秒かかります。

私は、システムコマンドプロンプトではなく、インタラクティブなPythonセッションから私の関数を呼び出すことを明示しています。これは問題ありませんが、それもMATLABのようなものです。システムプロンプトから関数を使用できるという優雅さが好きです。

私はPythonには新しく、この時点でどのように進めるべきか分かりません。私は新しいので、提案されたソリューションを実装する方法についてのリンクを感謝します。理想的には、複数のMacとLinuxマシン間でコードを移植する必要があるため、私は単純な解決策を探しています(すべてではありません)。

+0

チェック - それらのロードが少し速くなります。しかし、pycファイルが存在していても、これらの数字はかなり妥当です。 –

+0

また、 'sys.path'に.eggディレクトリがたくさんある場合は、それぞれの内部のモジュールを探しますので、処理が遅くなります。配布パッケージマネージャーまたはピップを使用して、より適切なレイアウトでインストールします。あなたは、しかし、大きなスピードを得ることはほとんどありません。 –

+0

私は以前の質問でpycの提案に気がつきましたが、私はモジュールのpycのバージョンを探すべきか分かりません。今、私はMacにいる。 – RAAC

答えて

9

単純なサーバー/クライアント、プロットの作成と更新を連続して実行するサーバー、およびクライアントが処理する次のファイルの通信だけを行うことができます。

私はsocketモジュールのドキュメントからの基本的な例に基づいて、単純なサーバ/クライアントの例を書いた:ここhttp://docs.python.org/2/library/socket.html#example

がserver.pyです:

# expensive imports 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import scipy.ndimage 
import scipy.signal 
import sys 
import os 

# Echo server program 
import socket 

HOST = ''     # Symbolic name meaning all available interfaces 
PORT = 50007    # Arbitrary non-privileged port 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
while 1: 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    data = conn.recv(1024) 
    if not data: break 
    conn.sendall("PLOTTING:" + data) 
    # update plot 
    conn.close() 

とclient.py:

# Echo client program 
import socket 
import sys 

HOST = '' # The remote host 
PORT = 50007    # The same port as used by the server 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.sendall(sys.argv[1]) 
data = s.recv(1024) 
s.close() 
print 'Received', repr(data) 

サーバーを実行するだけです。

python server.py 
輸入を行い

、クライアントは単にプロットにソケットを介して、新しいファイルのファイル名を送信します。

python client.py mytextfile.txt 

その後、サーバは、プロットを更新します。

client.py 0.03秒の実行中に、インポートを実行しているマシンで0.6秒かかります。

+1

btw、プロットのために、あなたは 'chaco'を見てみることができます:https://pypi.python.org/pypi/chaco –

+0

ありがとう、私はあなたのソリューションはおそらく行く方法だと思います。それ以来私はPyQtGraphにコードを切り替えました。なぜなら、私が生成しているダイナミックプロットを生成するのはMatplotlibよりも速いからです。チャコも確かに一見価値がある。 – RAAC

0

1.35秒は長くありませんが、「クイックチェック」の半分に慣れていると思われます。

アンドレアは、単純なクライアント/サーバーのセットアップを示唆して、あなたが同じように簡単にスクリプトの非常にわずかな修正を呼び出し、それはあなたが作業中にコンソールウィンドウ開いて保つことができるように私には思える:

  • コール入力
  • のいくつかの並べ替えをするスクリプトを提供
  • 再びコンソールを選択し
  • * *作業を行います。入力
  • は何でも、あなたの仕事に切り替え、コンソールウィンドウを最小化するために待機し、その後輸入を行うスクリプト、
  • が、それは喜んで入力

を待っている間、私は、あなたのスクリプトが毎回同じであると仮定し、あなたはそれを画像スタックの場所を与える必要はありません。すなわち、再び離れスクリプトから無インポートオーバーヘッドで

  • スイッチを結果を受け取りますまたは毎回特定のコマンドを入力することができます(ただし、これも簡単です)。

    例RAAC's_Script.py:

    import numpy as np 
    import matplotlib.pyplot as plt 
    import matplotlib.animation as animation 
    import scipy.ndimage 
    import scipy.signal 
    import sys 
    import os 
    
    print('********* RAAC\'s Script Now Running *********') 
    
    while True: # Loops forever 
        # Display a message and wait for user to enter text followed by enter key. 
        # In this case, we're not expecting any text at all and if there is any it's ignored 
        input('Press Enter to test image stack...') 
    
        ''' 
        * 
        * 
        **RAAC's Code Goes Here** (Make sure it's indented/inside the while loop!) 
        * 
        * 
        ''' 
    

    スクリプトを終了するには、コンソールウィンドウやプレスCtrl + Cを閉じます。

  • 2

    は、あなたが代わりに手動でモジュールをインポートすることができますなど、私は可能な限り、これはのようにシンプルにしましたが、それはうまく終了のようなものを扱うことは非常に少し余分に必要となる、入力に基づいて、わずかに異なることをやってimpを使用してください。 documentation hereを参照してください。例えば

    import numpy as npは、おそらくこれが必要なパッケージを見つけるためにsys.pathあなたの全体を閲覧からのpythonを惜しまます

    import imp 
    np = imp.load_module("numpy",None,"/usr/lib/python2.7/dist-packages/numpy",('','',5)) 
    

    のように書くことができます。

    も参照してください:

    それはPythonモジュールの.pycファイルのバージョン産だということ

    Manually importing gtk fails: module not found

    関連する問題