多处理迭代器,过滤添加到双端队列的内容

multiprocessing iterator, filter what gets added to the deque

我正在 运行 进行大型比较,但是总 运行 时间的大约 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 仅 returns 值,但是当没有返回任何内容时,双端队列会加载 None 。因为我是多处理正在使用 imap 我不确定如何过滤添加到双端队列的内容。

是否有 faster/more 有效的方法来删除这些 None 或首先阻止它们添加?

对于 deque 个对象,

.removean O(N) operation

所以,总的来说,如果有 M None 个,你就有 O(M*N) 个行为。

这是完全可以避免的。一种简单的方法是使用 filter:

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

如果你想在你已经有了 records 双端队列之后过滤掉它们,你可以这样做:

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

这会创建一个新的 deque