使用Joblib处理对象
我刚接触并行处理,想请教一些问题。
我有一个对象需要在内存中复制,大概需要复制50到100次,甚至更多。这是用在一个生物病毒模拟器里,我想模拟病毒在细胞内的复制和爆发。
我现在使用的代码是用深拷贝(请不要对我评判),逻辑如下:
from copy import deepcopy
from random import random
from datetime import datetime
import hashlib
class Virus(object):
def __init__(self):
self.id = None
self.SetID()
def SetID(self):
random_number = str(random())
current_time = str(datetime.now())
unique_string = random_number + current_time
unique_id = hashlib.new('sha512')
unique_id.update(unique_string)
self.id = unique_id.hexdigest()
def GetID(self):
return self.id
def Replicate(self):
new_virus = deepcopy(self)
new_virus.SetID()
return new_virus
因为我的目标是生成多个病毒的副本,但我可能需要多次迭代,所以我想用joblib
来加快速度。(我可能错了,如果是这样请纠正我!)于是我尝试了以下代码:
h = Virus()
results = Parallel(n_jobs=2)(delayed(h.Replicate())(h) for i in range(10))
我原本期待结果是一个包含10个病毒的列表,但结果却出现了一个类型错误,提示:
TypeError: 'Virus' object is not callable
我实在搞不懂这是怎么回事。怎样才能让这个代码正常工作呢?
1 个回答
4
“delayed”是用来包装一个函数的(不是对象,因为那样会返回一个复制的病毒)。所以在延迟调用中不要调用“Replicate”。
另外,看起来你也不能包装一个实例方法,所以把“replicate”做成一个普通的函数,这样它就可以复制它的参数。
def replicate(virus):
return virus.Replicate()
h = Virus()
results = Parallel(n_jobs=2)(delayed(replicate)(h) for i in range(10))
print [x.id for x in results]
对我来说是有效的