Python 3.x 基于先前值抛出结果的Python多处理
我正在尝试学习如何使用多处理,并设法使下面的代码正常工作。我们的目标是通过将n设置为某个数字来处理CostlyFunction中的每一个变量组合,现在它是100,因此将测试前100个组合。我希望我可以操纵w,因为每个进程都返回其list CostlyFunction返回一个包含7个值的列表,并且只将结果保持在给定的范围内。现在,w保存所有100个列表,然后让我操作这些列表,但是,当我使用n=10MM时,w变得巨大,保存起来很昂贵。当工人返回值,然后“抛出”我不需要的值时,是否有方法评估CostlyFunction的输出Python 3.x 基于先前值抛出结果的Python多处理,python-3.x,multiprocessing,Python 3.x,Multiprocessing,我正在尝试学习如何使用多处理,并设法使下面的代码正常工作。我们的目标是通过将n设置为某个数字来处理CostlyFunction中的每一个变量组合,现在它是100,因此将测试前100个组合。我希望我可以操纵w,因为每个进程都返回其list CostlyFunction返回一个包含7个值的列表,并且只将结果保持在给定的范围内。现在,w保存所有100个列表,然后让我操作这些列表,但是,当我使用n=10MM时,w变得巨大,保存起来很昂贵。当工人返回值,然后“抛出”我不需要的值时,是否有方法评估Costl
if __name__ == "__main__":
import csv
csvFile = open('C:\\Users\\bryan.j.weiner\\Desktop\\test.csv', 'w', newline='')
#width = -36000000/1000
#fronteir = [None]*1000
currtime = time()
n=100
po = Pool()
res = po.map_async(CostlyFunction,((i,) for i in range(n)))
w = res.get()
spamwriter = csv.writer(csvFile, delimiter=',')
spamwriter.writerows(w)
print(('2: parallel: time elapsed:', time() - currtime))
csvFile.close()
不幸的是,池没有“过滤器”方法;否则,您可能已经能够在返回结果之前对其进行修剪。imap可能是处理内存问题的最佳解决方案:它返回一个迭代器,遍历CostlyFunction的结果
为了对结果进行排序,我创建了一个简单的基于列表的类TopList,它存储固定数量的项目。根据关键功能,其所有项目都是排名最高的
from collections import Userlist
def keyfunc(a):
return a[5] # This would be the sixth item in a result from CostlyFunction
class TopList(UserList):
def __init__(self, key, *args, cap=10): # cap is the largest number of results
super().__init__(*args) # you want to store
self.cap = cap
self.key = key
def add(self, item):
self.data.append(item)
self.data.sort(key=self.key, reverse=True)
self.data.pop()
下面是代码的外观:
if __name__ == "__main__":
import csv
csvFile = open('C:\\Users\\bryan.j.weiner\\Desktop\\test.csv', 'w', newline='')
n = 100
currtime = time()
po = Pool()
best = TopList(keyfunc)
result_iter = po.imap(CostlyFunction, ((i,) for i in range(n)))
for result in result_iter:
best.add(result)
spamwriter = csv.writer(csvFile, delimiter=',')
spamwriter.writerows(w)
print(('2: parallel: time elapsed:', time() - currtime))
csvFile.close()
也许我的问题不在于w,而在于如何使用map\u async。在CostlyFunction返回一个列表后,我只希望它被添加到主列表中,或者如果它满足某些条件(如返回列表的第6个元素位于所有返回列表的前10个元素中),则该列表稍后将变为w。