在Python中并行化列表理解

2024-09-24 06:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

someList = [x for x in someList if not isOlderThanXDays(x, XDays, DtToday)]

我有这一行,函数isOlderThanXDays进行了一些API调用,导致它需要一段时间。我想在python中使用multi/parrelel处理来执行这个操作。完成列表的顺序无关紧要(我认为是异步的)

函数isOlderThanXDays本质上返回一个布尔值,所有比它新的内容都使用列表理解保存在新列表中。你知道吗

编辑: 函数参数:所以XDays是用户传入的,比如说60天。DtToday是今天的日期(date-time对象)。然后我进行API调用以查看文件修改日期的元数据,如果该日期较旧,则返回true,否则返回false。你知道吗

我正在寻找类似下面的问题。不同的是这个问题对于每个列表输入都有一个输出,而我的问题类似于根据所用函数的布尔值过滤列表,所以我不知道如何在我的场景中应用它

How to parallelize list-comprehension calculations in Python?


Tags: 函数inapi列表forif顺序not
2条回答

您可以使用线程池:

from multiprocessing.pool import ThreadPool # Class which supports an async version of applying functions to arguments
from functools import partial

NUMBER_CALLS_SAME_TIME = 10 # take care to avoid throttling
# Asume that isOlderThanXDays signature is isOlderThanXDays(x, XDays, DtToday)
my_api_call_func = partial(isOlderThanXDays, XDays=XDays, DtToday=DtToday)
pool = ThreadPool(NUMBER_CALLS_SAME_TIME)
responses = pool.map(my_api_call_func, someList)

这应该并行运行所有检查,然后筛选出未通过检查的检查。你知道吗

import multiprocessing

try:
    cpus = multiprocessing.cpu_count()
except NotImplementedError:
    cpus = 2   # arbitrary default


def MyFilterFunction(x):
    if not isOlderThanXDays(x, XDays, DtToday):
        return x
    return None

pool = multiprocessing.Pool(processes=cpus)
parallelized = pool.map(MyFilterFunction, someList)
newList = [x for x in parallelized if x]

相关问题 更多 >