我有以下功能:如何讓Pool.map採取lambda函數
def copy_file(source_file, target_dir):
pass
現在我想用multiprocessing
才能執行該功能一次:
p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
的問題是,lambda的不能被醃製,所以這失敗了。什麼是最整齊(pythonic)的方式來解決這個問題?
我有以下功能:如何讓Pool.map採取lambda函數
def copy_file(source_file, target_dir):
pass
現在我想用multiprocessing
才能執行該功能一次:
p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
的問題是,lambda的不能被醃製,所以這失敗了。什麼是最整齊(pythonic)的方式來解決這個問題?
使用函數對象:
class Copier(object):
def __init__(self, tgtdir):
self.target_dir = tgtdir
def __call__(self, src):
copy_file(src, self.target_dir)
要運行Pool.map
:
p.map(Copier(target_dir), file_list)
答案下面是欲絕,因爲這does not actually work在Python2因爲functools.partial
對象(在Python2)不是picklable。
functools.partial
對象在Python3中是可挑選的,所以這個解決方案在那裏工作。
你可以使用
functools.partial:
import functools
copier=functools.partial(copy_file,target_dir=target_dir)
p.map(copier,file_list)
問題是有點老,但如果你還在使用Python 2我的回答可能是有用的。
特技是用pathos項目的一部分:multiprocess多處理分叉。它擺脫了原始多進程的煩人侷限。
安裝:pip install multiprocess
用法:
>>> from multiprocess import Pool
>>> p = Pool(4)
>>> print p.map(lambda x: (lambda y:y**2)(x) + x, xrange(10))
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]
從this答案,悲情讓你運行你的拉姆達p.map(lambda x: copy_file(x,target_dir), file_list)
直接,保存所有的解決方法/黑客
謝謝,這確實是我所需要的! – 2011-01-28 11:10:22
謝謝!我真的希望他們能夠接受lambda函數! – yeelan 2016-05-14 23:54:44