使用Joblib处理对象

0 投票
1 回答
1597 浏览
提问于 2025-04-18 07:13

我刚接触并行处理,想请教一些问题。

我有一个对象需要在内存中复制,大概需要复制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]

对我来说是有效的

撰写回答