【发布时间】:2018-05-11 14:27:39
【问题描述】:
编辑:运行 Apple MBP 2017 Model 14,3,2.8GHz i7 4 核:
multiprocessing.cpu_count()
8
我有一个对象列表,我在 python 中为每个对象执行一次对象方法。该过程适用于遗传算法,因此我有兴趣加快它的速度。基本上,每次我使用数据列表中的数据更新环境时,对象(基因组)都会执行一些数学运算,包括从环境中获取值,并引用它自己的内部值。
我在做:
from multiprocessing import Pool
class Individual(object):
def __init__(self):
self.parameter1 = None
self.parameter2 = None
def update_values():
# reads the environment variables, does math specific to each instance
# updates internal parameters
a, b, c, d = environment_variables
self.parameter1 = do_math(a, b, c, d,
self.parameter1, self.parameter2)
self.parameter2 = do_math(a, b, c, d,
self.parameter1, self.parameter2)
data_list = [data1, data2, data3, ..., data1000]
object_list = [object1, object2, object3, ..., object20000]
如果我运行这个:
for newdataset in data_list:
update_parameters(newdataset)
for object in object_list:
object.update_values()
这比我尝试使用 multiprocessing/map 拆分它快 很多:
def process_object(object):
object.update_values()
for newdataset in data_list:
update_parameters(newdataset)
with Pool(4) as p:
p.map(process_object, object_list)
如果我以 200(而不是 20000)的 object_list 长度运行,则在单线程模式下总时间为 14.8 秒。
如果我在多处理模式下运行相同的总时间......仍在等待......好的...... 211秒。
此外,它似乎根本没有按照函数所说的那样做。我在这里想念什么?当我检查每个对象的值时,它们似乎根本没有更新。
【问题讨论】:
-
您能否详细说明正在进行的处理方式?另外,你有多少个核心?什么操作系统?
-
此外,传递给进程的所有参数都必须是可序列化的。那么,object_list 中有哪些对象(类实例默认不是serialize-ale)?
-
multiprocessing 使用pickle 来序列化数据,并且可以处理类以及递归结构。
-
哇,谢谢大家。我将再次编辑我的问题以使其更清楚。
标签: python python-3.x multiprocessing