首页 > 解决方案 > 如何使用多处理来并行化收集与给定条件匹配的项目的过滤功能?

问题描述

我的程序生成可能的球队,然后为梦幻篮球过滤有效的球队,它具有以下约束:

以下是球员的定义和球队的例子:

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()功能。

标签: pythonparallel-processingmultiprocessing

解决方案


像这样的东西应该工作。你需要把你的功能变成一个 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]

推荐阅读