python - 如何使用多处理来并行化收集与给定条件匹配的项目的过滤功能?
问题描述
我的程序生成可能的球队,然后为梦幻篮球过滤有效的球队,它具有以下约束:
- 每队7名球员
- 预算小于或等于 70 M
- 每个位置至少一名球员(PG、SG、SF、PF、C)
以下是球员的定义和球队的例子:
from collections import Counter
from dataclasses import dataclass
from itertools import combinations
BUDGET = 70.0
MINIMUM_BUDGET_USED = BUDGET * 0.985
PLAYERS_PER_TEAM = 7
@dataclass
class Player:
full_name: str
club: str
position: str
price: float
team_example = (
Player(full_name='Jarred Vanderbilt', club='MIN',position='PF', price=5.6),
Player(full_name='Doug McDermott', club='SAS', position='SF', price=4.6),
Player(full_name='Mohamed Bamba', club='ORL', position='C', price=9.3),
Player(full_name='Caris Levert', club='IND', position='SG', price=9.0),
Player(full_name="De'Aaron Fox", club='SAC', position='PG', price=11.8),
Player(full_name='Giannis Antetokounmpo', club='MIL', position='PF', price=16.0),
Player(full_name='Julius Randle', club='NYK', position='PF', price=13.6)
)
生成了 7 个玩家的所有可能组合:
def generate_teams(players, players_per_team=PLAYERS_PER_TEAM):
return combinations(players, players_per_team)
我只想保留有效的:
def keep_valid_teams(possible_teams):
return [pt for pt in possible_teams if is_valid_team(pt)]
def is_valid_team(possible_team):
return all([are_correct_positions(possible_team),
is_valid_budget(possible_team),])
def are_correct_positions(possible_team):
positions = Counter(p.position for p in possible_team)
return len(positions) == 5 and max(positions.values()) <= 3
def is_valid_budget(possible_team):
budget_used = sum(p.price for p in possible_team)
return budget_used >= MINIMUM_BUDGET_USED and budget_used <= BUDGET
我的问题是如何使用多处理来并行化keep_valid_teams()
功能。
解决方案
像这样的东西应该工作。你需要把你的功能变成一个 map()
from multiprocessing import Pool
def keep_valid_teams(possible_teams):
with Pool(5) as p:
is_valid_team_list = p.map(is_valid_team, possible_teams)
return [pt for pt, is_valid_team in zip(possible_teams, is_valid_teams_list) if is_valid_team]
推荐阅读
- php - 从mysql中的不同表中提取两列
- reactjs - 我们可以通过在组件中使用 componentDidCatch 来捕获操作引发的异常吗?
- google-maps - 如何在 iOS 和 android 上以 react native 实现谷歌地图?
- jquery - 重新连接到 Nodejs socket.io 服务器
- linux-kernel - 在 Linux 内核中向用户空间公开一个额外的标头
- java - 如何使用 O(n) 时间复杂度算法查找有效子字符串的数量
- binary - 将二进制文件从特定地址点填充到地址中的另一个特定地址点
- jquery - Jquery:更改 div 的内容会修改其行为
- typescript - Vue + webpack + TS:生成声明时找不到.vue.d.ts
- angular - 在 Angular 上调整 SVG 大小