2011-08-17 11 views
3

joblib.Parallelで使用するには、boost :: python関数をpickleする必要があります。 私はそうしようとすると、私は私の知る限り理解し、関数は唯一の完全修飾名で漬けされなければならないpickling boost python functions

TypeError: can't pickle builtin_function_or_method objects 

を取得します。 これはなぜできないのでしょうか。 アイデア

+0

あなたはコード(または少しスニペット)を投稿することができますを与えましたこの例外? –

+0

まあ、私は 'cPickle.dumps(boost_function)にそれを減少' 'boost_function'がブースト::のpythonモジュール –

答えて

1

あなたは多分あなたはあなたのブースト法の周りにラッパーを使用することができ、joblib.Parallelオブジェクトであなたのブースト方式を使用する場合:

from joblib import Parallel, delayed 
from boost import boost_function 

class Wrapper(object): 
    def __init__(self, method_name, module_name): 
     self.method_name = method_name 
     self.module_name = module_name 

    def __call__(self, *args, **kwargs): 
     method = __import__(self.module_name, globals(), locals(), [self.method_name,]) 
     return method(*args, **kwargs) 

Parallel(n_jobs=1)(delayed(Wrapper("boost_module_name_with_dots", "boost_method_name")(i) for i in range(10)) 
+0

から輸入された ええ、それは私が(まあ、ないように美しく、あなたがsuggesxtedとして)やったことだとできます。しかし、なぜそれは元の機能を漬けて動作しないのですか? –

+0

@Andreas Muller:pickleのドキュメントとエラーによると、pickleしようとしているメソッドはトップレベルモジュールで定義されたメソッドではなく、オブジェクトメソッドです... –

+0

from my_boost_module import my_cpp_function' 。 これはトップレベルの方法としては十分ではありませんか? –