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

Posted

技术标签:

【中文标题】如何使用多处理来并行化收集与给定条件匹配的项目的过滤功能?【英文标题】:How to use multiprocessing to parallelize a filtering function that collects items matching given conditions? 【发布时间】:2021-12-19 23:13:25 【问题描述】:

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

每队 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? 是的,比如map,我不知道如何在这个上下文中使用谓词。 【参考方案1】:

这样的事情应该可以工作。你需要把你的函数变成一个 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]

【讨论】:

它确实有效。据我了解,它分两个阶段进行:制作有效团队的位图,然后将True 合并? 正确。另请注意,“5”参数是进程数。你可能还想看看 pypy 因此必须将其分解为两个操作,因为不可能通过map一次性完成? 一般来说map的输入记录和输出记录是一一对应的关系。当输入记录多于输出记录时使用reduce。可以将内置函数 sum()、filter() 实现为 reduce 操作或 map-reduce 但不是 map 这就是为什么我只能通过map 努力获得想要的结果。谢谢!

以上是关于如何使用多处理来并行化收集与给定条件匹配的项目的过滤功能?的主要内容,如果未能解决你的问题,请参考以下文章

聊聊C++异步编程-1

如何从 pytorch 模型并行化模型预测?

(转)并行与并发的区别

使用 MPI 分配进程

将多处理和并行性应用于 numpy 函数

如何使用熊猫对与给定条件匹配的列中的值求和?