Python 3.x 基于先前值抛出结果的Python多处理

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

我正在尝试学习如何使用多处理,并设法使下面的代码正常工作。我们的目标是通过将n设置为某个数字来处理CostlyFunction中的每一个变量组合,现在它是100,因此将测试前100个组合。我希望我可以操纵w,因为每个进程都返回其list CostlyFunction返回一个包含7个值的列表,并且只将结果保持在给定的范围内。现在,w保存所有100个列表,然后让我操作这些列表,但是,当我使用n=10MM时,w变得巨大,保存起来很昂贵。当工人返回值,然后“抛出”我不需要的值时,是否有方法评估CostlyFunction的输出

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。