2011-08-17 99 views
3

對於與joblib.Parallel一起使用,我需要能夠pickle boost :: python函數。 當我嘗試這樣做,我得到一個酸洗增強python函數

TypeError: can't pickle builtin_function_or_method objects 

據我瞭解,該功能只能由完全合格的名稱進行酸洗。 我不明白爲什麼這是不可能的。 任何想法?

+0

你能張貼代碼(或一小片段),其產生你這個例外? –

+0

好吧,我把它降低到 'cPickle.dumps(boost_function)' 其中'boost_function'從一個boost :: 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'導入了它。 這不足以成爲頂級方法嗎? –