對於與joblib.Parallel一起使用,我需要能夠pickle boost :: python函數。 當我嘗試這樣做,我得到一個酸洗增強python函數
TypeError: can't pickle builtin_function_or_method objects
據我瞭解,該功能只能由完全合格的名稱進行酸洗。 我不明白爲什麼這是不可能的。 任何想法?
對於與joblib.Parallel一起使用,我需要能夠pickle boost :: python函數。 當我嘗試這樣做,我得到一個酸洗增強python函數
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'從一個boost :: Python模塊進口 –