joblib.Parallelで使用するには、boost :: python関数をpickleする必要があります。 私はそうしようとすると、私は私の知る限り理解し、関数は唯一の完全修飾名で漬けされなければならないpickling boost python functions
TypeError: can't pickle builtin_function_or_method objects
を取得します。 これはなぜできないのでしょうか。 アイデア
joblib.Parallelで使用するには、boost :: python関数をpickleする必要があります。 私はそうしようとすると、私は私の知る限り理解し、関数は唯一の完全修飾名で漬けされなければならないpickling boost python functions
TypeError: can't pickle builtin_function_or_method objects
を取得します。 これはなぜできないのでしょうか。 アイデア
あなたは多分あなたはあなたのブースト法の周りにラッパーを使用することができ、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))
から輸入された ええ、それは私が(まあ、ないように美しく、あなたがsuggesxtedとして)やったことだとできます。しかし、なぜそれは元の機能を漬けて動作しないのですか? –
@Andreas Muller:pickleのドキュメントとエラーによると、pickleしようとしているメソッドはトップレベルモジュールで定義されたメソッドではなく、オブジェクトメソッドです... –
from my_boost_module import my_cpp_function' 。 これはトップレベルの方法としては十分ではありませんか? –
あなたはコード(または少しスニペット)を投稿することができますを与えましたこの例外? –
まあ、私は 'cPickle.dumps(boost_function)にそれを減少' 'boost_function'がブースト::のpythonモジュール –