如何使用多处理来加速这个循环(池.map)

2024-09-29 21:44:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个循环来查找我所拥有的数据集的所有组合。当迭代_depth=3时,运行大约需要13分钟。我的笔记本电脑有2个核,所以我想用multiprocessing来加速它,但是由于我不知道我在做什么,语法/参数让我很困惑。在

import multiprocessing

def FindAllAffordableLineups():
    all_rosters = []
    roster = [None]*8

    for n in range(int(iteration_depth)):
        for catcher in catcher_pool[0:n]:
            roster = [None]*8
            roster[0] = catcher[0]
            for first_baseman in first_pool[0:n]:
                roster[1] = first_baseman[0]
                for second_baseman in second_pool[0:n]:
                    roster[2] = second_baseman[0]
                    for third_baseman in third_pool[0:n]:
                        roster[3] = third_baseman[0]
                        for shortstop in short_pool[0:n]:
                            roster[4] = shortstop[0]
                            for outfielders in it.combinations(of_pool, 3):
                                roster[5:8] = outfielders[0][0], outfielders[1][0], outfielders[2][0]
                                salaryList = []
                                for player1 in roster:
                                    for player2 in player_pool:
                                        if player1 == player2[0]:
                                            salaryList.append(int(player2[3]))
                                if sum(salaryList) <= remaining_salary:
                                    if len(roster) == len(set(roster)):
                                        all_rosters.append(roster[:])
                                        if len(all_rosters) < 50:
                                            print('Number of possible rosters found: ',len(all_rosters))
                                        if len(all_rosters) == 50:
                                            print("Fifty affordable rosters were found. We're not displaying every time we find another one. That would slow us down a lot.")          
                                        salaryList = []
                                if len(all_rosters) > 10**6:
                                    writeRosters = open(os.path.join('Affordable Rosters.csv'), 'w', newline = '')
                                    csvWriter = csv.writer(writeRosters)
                                    for row in all_rosters:
                                        csvWriter.writerow(row)
                                    writeRosters.close()
                                    all_rosters = []
        writeRosters = open(os.path.join('Affordable Rosters.csv'), 'w', newline = '')
        csvWriter = csv.writer(writeRosters)
        for row in all_rosters:
            csvWriter.writerow(row)
        writeRosters.close()

pool = multiprocessing.Pool(processes=2)
r = pool.map(FindAllAffordableLineups())

这给了我

^{pr2}$

在我看过的大多数例子中,定义的函数都有一些需要在函数内部执行的参数,这就是map.pool命令中的iterable,但我的函数不需要这个参数。我怎么解决这个问题?在


Tags: csvinforlenifallrowpool
1条回答
网友
1楼 · 发布于 2024-09-29 21:44:21

您的代码本质上是查找列表的笛卡尔积

[接球池、第一池、第二池、第三池、短池]+it.组合(池的,3)

参考这篇文章,看看如何才能很好地做到这一点:Get the cartesian product of a series of lists?

然后您可以创建一个helper函数来过滤无效的列表

这会给你一个合理的加速,但是如果你还想并行化,那么我会利用你代码的树状结构,依次挑选前几个播放器(给你一个前几个播放器的元组列表),然后把这些元组(并行地)映射到函数的其余部分。在

相关问题 更多 >

    热门问题