我写了一个循环来查找我所拥有的数据集的所有组合。当迭代_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,但我的函数不需要这个参数。我怎么解决这个问题?在
您的代码本质上是查找列表的笛卡尔积
[接球池、第一池、第二池、第三池、短池]+it.组合(池的,3)
参考这篇文章,看看如何才能很好地做到这一点:Get the cartesian product of a series of lists?
然后您可以创建一个helper函数来过滤无效的列表
这会给你一个合理的加速,但是如果你还想并行化,那么我会利用你代码的树状结构,依次挑选前几个播放器(给你一个前几个播放器的元组列表),然后把这些元组(并行地)映射到函数的其余部分。在
相关问题 更多 >
编程相关推荐