這是我在使用多處理之前的代碼。獲取滿足指定條件的大規模迭代器中的專案數是一項任務:
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 能力來盡可能快地完成這個過濾任務?多處理和多執行緒真的讓我感到困惑。:(
uj5u.com熱心網友回復:
與itertools.permutations. 同時,幾乎任何排列問題都可以使用簡單的階乘來解決。
你的“巨大”迭代器可以寫成
data = ['A', 'B', 'C', ...]
pattern = ('A', 'B')
sum(pattern in x for x in permutations(data))
話雖如此,factorial(len(data))可能存在總排列。如果data沒有重復,那么factorial(len(data) - len(pattern))除了在pattern,以及可以居住的len(data) - len(pattern) 1地方之外,還有可能的專案安排pattern。
從 python 3.8 開始,你可以做
from math import prod
count = prod(range(2, len(data) - len(pattern) 2))
對于以前的版本,您必須這樣做
from functools import reduce
from operator import mul
count = reduce(mul, range(2, len(data) - len(pattern) 2), 1)
對于在 中data存在重復的情況pattern,您可以在 google 上搜索諸如“多少排列將包含特定序列”之類的內容,以幫助您找出分析公式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359337.html
上一篇:python執行緒本地意外值
