Распараллеливание понимания списка в Python - PullRequest
0 голосов
/ 21 ноября 2019

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

У меня есть эта строка, и функция isOlderThanXDays делает некоторые вызовы API, в результате чего это занимает некоторое время. Я хотел бы выполнить это с помощью multi / parrellel обработки в Python. Порядок, в котором составляется список, не имеет значения (я думаю, что он асинхронный)

Функция isOlderThanXDays, по сути, возвращает логическое значение, и все, что новее, чем хранится в новом списке с помощью функции понимания списка.

Редактировать: Параметры функции: Таким образом, XDays для пользователя, чтобы передать, скажем, 60 дней. и DtToday - сегодняшняя дата (дата и время объекта). Затем я делаю вызовы API для просмотра метаданных даты изменения файла и возвращаю, если он старше, я возвращаю true, иначе false.

Я ищу что-то похожее на вопрос ниже. Разница в том, что этот вопрос для каждого входного списка есть выходной, тогда как мой подобен фильтрации списка на основе логического значения из используемой функции, поэтому я не знаю, как применить его в моем сценарии

Как распараллелить вычисления со списком в Python?

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

Это должно выполнить все ваши проверки параллельно, а затем отфильтровать те, которые не прошли проверку.

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]
0 голосов
/ 21 ноября 2019

Вы можете использовать ThreadPool:

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)
...