多处理迭代器,过滤添加到双端队列的内容
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
个对象,.remove
是 an 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
。
我正在 运行 进行大型比较,但是总 运行 时间的大约 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
个对象,.remove
是 an 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
。