如何使用多处理并行化收集符合给定条件的项目的过滤功能?
How to use multiprocessing to parallelize a filtering function that collects items matching given conditions?
我的程序生成可能的球队,然后为梦幻篮球过滤有效球队,它有以下限制:
- 每队 7 名球员
- 预算小于等于70M
- 每个位置(PG、SG、SF、PF、C)至少 1 名球员
这里是球员的定义和球队的例子:
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]
我的程序生成可能的球队,然后为梦幻篮球过滤有效球队,它有以下限制:
- 每队 7 名球员
- 预算小于等于70M
- 每个位置(PG、SG、SF、PF、C)至少 1 名球员
这里是球员的定义和球队的例子:
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]