1

IPython.parallelを使用して関数を並列化したいのですが、IPythonシェルで関数を定義すると、問題なく機能します。

Type:       function
Base Class: <type 'function'>
String Form:<function gradient at 0x3ae0398>
Namespace:  Interactive
File:       /root/<ipython-input-30-cf7eabdfef84>
Definition: gradient(w) 
Source:
def gradient(w):
    s = (1.0 + exp(y * (X * w)))**-1
    return C*X.T*((1 - s) * y)

rc = Client() 
rc[:].apply_sync(gradient, w)
...

ただし、モジュールで定義してインポートを使用すると、次のようになります。

Type:       function
Base Class: <type 'function'>
String Form:<function gradient at 0x3933d70>
Namespace:  Interactive
File:       /root/mv.py
Definition: mv.gradient(w)
Source:
def gradient(w):
    s = (1.0 + exp(y * (X * w)))**-1
    return C*X.T*((1 - s) * y)

import mv 
rc = Client()
rc[:].apply_sync(mv.gradient, w)

CompositeError: one or more exceptions from call to method: gradient
[0:apply]: NameError: global name 'y' is not defined
[1:apply]: NameError: global name 'y' is not define

さらに、Python 2.7.2 / IPython 0.12を実行しているローカルシステムでは正常に動作しますが、最新のStarclusterUbuntuAMIを使用しているPython2.7.2+ /IPython0.12ではクラッシュします。

ここで何が起こっているのですか?

更新:githubからIPython 0.13.devバージョンをインストールしましたが、動作するようになりました。

4

1 に答える 1

3

違いはモジュールグローバルです。関数がモジュールで定義されている場合、グローバル名前空間はモジュールの名前空間です(つまりmv.y)。そのモジュールが__main__、たとえばインタラクティブに定義された関数である場合、グローバル名前空間はエンジン上のuser_nsであり、の影響を受けexecute("y=5")ます。

IPythonは、インタラクティブに定義されているかのように動作する(グローバルとしてユーザー名前空間にアクセスできる)モジュールで関数を定義する場合に、デコレーターを提供します。

#mymod

IPython.parallel.utilからインポートインタラクティブ

@相互の作用
def by_a(b):
    """aにbを掛ける"
    a*bを返す

そしてインタラクティブに、あなたはすることができます:

mymodimportby_aから

e0 = rc [0]
e0.execute( "a = 5")
印刷e0.apply_sync(by_a、10)#50
e0.execute( "a = 10")
印刷e0.apply_sync(by_a、10)#100
于 2012-05-05T18:54:22.517 に答える