2012-07-03 13 views
7

小さな関数でEnthought EPD-Free 7.3-1を使用しています。私はインタラクティブセッション(PyLab)に切り取って実行すると、1秒以下で完了します。コマンドライン "python probtest.py"から同じコードを実行すると、16秒以上かかる。Python対話型シェルはコマンドラインよりも16倍高速です - 何が問題なのですか?

私は両方が同じpython環境を使用していることを確認しました。多分関連しているかもしれませんが、.pyファイルのディレクトリには、.pycというファイルはありません...私が最近行ったpythonスクリプトは、.pycファイルに関連付けられていません。私は "修復許可"(Mac OSX-Lion)を使用してフォルダの読み取り/書き込みのアクセス許可を確認し、EPD_Free Pythonをアンインストール/再インストールしましたが、運はありません。

私は何が原因か分からない。私が使用しているコード(サイコロのx個の簡単なテストは、少なくともYシックス探し):コマンドラインのpythonはそんなに遅い理由について

import numpy as np 
import sys 

def runTest(numDice, numSixes, numThrows = 10000): 
    nSuccess = 0 
    for i in range(numThrows): 
     dList = np.random.randint(1,7,numDice) 
     if sum(dList==6) >= numSixes: 
      nSuccess += 1 
    return float(nSuccess)/numThrows 

print runTest(900,150,5000) 
print sys.version 

任意の考え?前もって感謝します。

答えて

9

ああ、これはよく知られているようです。ピラッブインターフェイスを使用している場合は、おそらくnumpy sumをスコープにインポートして、組み込み関数をオーバーライドします。 numpyのの合計ははるかに高速になります(以下の2つのコード間の唯一の違いは、私は2番目にfrom numpy import sumを追加したということです):

localhost-2:coding $ time python sumtime.py 
0.5106 
2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 

real 0m20.313s 
user 0m19.955s 
sys 0m0.247s 
localhost-2:coding $ time python sumtime_with_np_sum.py 
0.5118 
2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 

real 0m0.572s 
user 0m0.345s 
sys 0m0.220s 

あなたはsum is np.sumかどうかをチェックすることによってこれを確認することができます。

+0

ありがとう!それはまさに問題でした!本当にありがとう、あなたは私の正気を救った! –

+0

心配はいりません。先週、私は怠け者であり、 'numpy import 'から組み込み' any'を 'numpy.any'に置き換えて、コード自体を見ることでデバッグするのがほとんど不可能なので、バグに苦労しなければなりませんでした。それは私の心の上にあった.. – DSM

3

IronPythonでこの問題が検出されました。コマンドラインは、呼び出しごとにデフォルトでたくさんの項目をインポートしていました。そして、インタラクティブシェルには一度ロードされて準備が整いました!

どのようなインポートがデフォルトで行われているかを確認し、タイミングから削除します。

+0

ありがとう、その一部かもしれませんが、余分な時間は繰り返し回数が増えるにつれて直線的に増加するようです... numThrowsを5000から500に減らすと、コマンドラインの時間が2秒未満に短縮され、 numThrowsが5000に戻ると16秒に戻ります。 –

関連する問題