我试图弄清楚我包含在我的可迭代 pool.map 函数的列表理解中的对象列表是否正在由工作人员直接访问,或者作品是否正在接收列表的副本。
我正在使用 DEAP 并成功实现了多处理。最初我会将 CSV 文件读入数组并将数组发送给工作人员,但随后每个工作人员都需要创建自己的对象列表。我想如果我可以创建一次对象并发送它们的副本,它可能会加快速度。
除了在主上下文中创建对象列表的小加速之外,它似乎在两种方式下都可以相同地工作。我想确保工作人员不会修改相同的列表对象。
我通过从 CSV 文件中读取数据并将对象附加到我在主上下文中定义的列表来创建列表。
例子:
if __name__ == '__main__':
start_time = time.time()
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
toolbox.register("map", pool.map)
_jobsArray = []
with open('.\Datasets\Jobs.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
next(readCSV) # Skip the header
for row in readCSV:
Job(row[0], literal_eval(row[1]), literal_eval(row[3]), literal_eval(row[2]), literal_eval(row[4])))
后来我使用列表推导来创建必要的迭代:
fitnesses = toolbox.map(toolbox.evaluate, [(indiv, _jobsArray, _machinesArray) for indiv in invalid_ind])
然后我在我的评估函数中解压缩元组并使用对象。
我使用不同阶段的打印来尝试确定列表的状态。根据元组解包后的打印,列表在评估开始时处于默认状态。在评估结束时,它们都与原始状态不同,并且在足够多的情况下,群体成员之间存在差异(预计会有一些相同的个体)。
似乎工作人员并未全部编辑在主要上下文中创建的原始列表。有人可以证实这一点吗?