многопроцессорный итератор, фильтр того, что добавляется в очередь - PullRequest
0 голосов
/ 03 ноября 2018

Я выполняю большое сравнение, но примерно 25% от общего времени выполнения уходит на очистку устройства после завершения сравнений. Мой код выглядит примерно так:

from collections import deque
from multiprocessing import Pool
from _map_workflow import val_comp

if __name__ == '__main__':
    pool = Pool()
    records = deque(pool.imap_unordered(val_comp, combinations(index_tups,2)))

    for _ in range(records.count(None)):
        records.remove(None)

Функция сравнения val_comp возвращает значения только при соблюдении определенных критериев, но в deque загружается None, когда ничего не возвращается. Поскольку я использую многопроцессорную систему imap, я не уверен, как отфильтровать то, что добавляется в очередь.

Существует ли более быстрый / более эффективный способ удаления этих None или предотвращения их добавления в первую очередь?

1 Ответ

0 голосов
/ 03 ноября 2018

.remove - это операция O (N) для deque объектов.

Итак, в целом, если есть M None, у вас есть поведение O (M * N).

Этого вполне можно избежать. Один простой способ - использовать filter:

records = deque(filter(None, pool.imap_unordered(val_comp, combinations(index_tups,2))))

Если вы хотите отфильтровать их после того, как у вас уже есть records deque, вы можете сделать что-то вроде:

records = deque(x for x in records if x is not None)

, который создает новый deque.

...