【发布时间】:2021-11-11 16:13:28
【问题描述】:
这是我在使用多处理之前的代码。获取大量迭代器中满足指定条件的项目数是一项任务:
from itertools import permutations
def f(input_):
if 'AB' in ''.join(input_):
return True
else:
return False
if __name__ == "__main__":
iterator = permutations(['A', 'B',...])
count = 0
for item in iterator: # it is an itertools.permutations object, with str inside
if f(item):
count += 1
print(count)
但是迭代器太大了,我需要做多处理或多线程(不确定哪个更好)来加快进程。
我参考了很多关于 Python 中多任务的在线参考资料,并尝试了几种方法。不幸的是,我仍然找不到解决方案,因为我尝试的每种方法都有一些问题。 例如:
from multiprocessing import Pool
def f(input_):
if 'AB' in ''.join(input_):
return True
else:
return False
if __name__ == "__main__":
pool = Pool()
result = pool.imap_unordered(f, iterator)
print(sum(result))
在这个例子中,问题是这段代码的运行速度比我原来的还要慢。我也尝试过使用 pool.map(),但它也比以前慢了,而且它耗尽了我所有的内存。
我应该如何使用我所有的 CPU 能力尽可能快地完成这个过滤任务?多处理和多线程真的让我很困惑。 :(
【问题讨论】:
-
在不知道迭代器做什么的情况下,不可能说出如何处理这个问题。多线程/处理有其自身的开销,如果迭代器进行磁盘 I/O,并行化将没有用处。
-
我建议通过将原始代码压缩为
count = sum(map(f, iterator))来消除不必要的开销。不会更改 big-O,但会消除一些不必要的开销(此外,作为微优化,如果f返回1/0而不是True/@,sum的快速路径会更好地工作987654329@)。也就是说,任何真正的节省都取决于了解f是如何实现的。 -
@MadPhysicist 迭代器的类型是
itertools.permutations。这是字符串的排列。如['A', 'B', 'C']的排列,校验条件如if 'AB' in ''.join(input_)。 -
如果我理解你的描述,这是一个可以非常清楚地在 O(1) 时间内解决的问题。
-
抱歉信息不足,我已经更新了问题。
标签: python python-3.x multithreading multiprocessing