我已經在python中用itertools.permutations函數生成了排列組合。問題是,結果是非常大的,我想通過它與多線程,但真的不知道如何完成,這裏是我到目前爲止有:Python排列線程
perms = itertools.permutations('1234', r=4)
#I would like to iterate through 'perms' with multiple threads
for perm in perms:
print perm
我已經在python中用itertools.permutations函數生成了排列組合。問題是,結果是非常大的,我想通過它與多線程,但真的不知道如何完成,這裏是我到目前爲止有:Python排列線程
perms = itertools.permutations('1234', r=4)
#I would like to iterate through 'perms' with multiple threads
for perm in perms:
print perm
如果您希望對來自置換生成器的項目所做的工作是CPU密集型的,那麼您可能希望使用進程而不是線程。在執行CPU綁定工作時,CPython的全局解釋器鎖(GIL)會進行有限值的多線程處理。
相反,使用multiprocessing
模塊的Pool
類,如下所示:
import multiprocessing
import itertools
def do_stuff(perm):
# whatever
return list(reversed(perm))
if __name__ == "__main__":
with multiprocessing.Pool() as pool: # default is optimal number of processes
results = pool.map(do_stuff, itertools.permutations('1234', r=4))
# do stuff with results
請注意,如果你將遍歷results
(而不是做它的東西作爲一個列表),你可以使用imap
代替map
獲得一個迭代器,您可以使用它來處理從工作進程生成的結果。如果返回項目的順序無關緊要,您可以使用imap_unordered
(我認爲)節省一點內存。
if __name__ is "__main__"
樣板需要在Windows上,其中multiprocessing
模塊必須解決操作系統的限制(沒有fork
)。
Python的futures模塊使得容易在線程之間分割工作。在這個例子中,將使用4個線程,但您可以修改它以滿足您的需求。
from concurrent import futures
def thread_process(perm):
#do something
with futures.ThreadPoolExecutor(max_workers=4) as executor:
for perm in perms:
executor.submit(thread_process, perm)
使用線程的問題是,由於GIL不會並行執行,它不會執行OP所需的操作 –
我看不到在哪裏他說「通過多線程」意味着什麼 - 他可以做任何事情,從執行另一個進程到執行阻塞線程的套接字/文件調用。在這些情況下,GIL不會引起問題。我同意這當然取決於他想做什麼。 –
假設你的處理函數爲f(x)的你想要做
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
perms = itertools.permutations('1234', r=4)
for r in pool.map(f, perms):
print (r)
事實上,使用線程不會並行執行的過程中,除非是IO約束。如果它是CPU綁定的並且你有一個四核,那麼這是一條路。如果你沒有多核心並且CPU受限,那麼恐怕平行並不會改善你目前的狀況。
拆分線程之間燙髮的數量的索引然後使用this function生成從它的索引中的每個線程的燙髮而不是生成所有的燙髮和線程之間分裂他們。
你想如何拆分線程之間的數據?你爲什麼要使用多個線程? –
我想平均分配它:如果'perms'包含1'000'000條目並且我有4個線程,則每個線程應該處理250'000個條目;如果我只使用一個線程,則需要大約10分鐘才能完成整個條目,因此我想使用多個線程 – wasp256
什麼是您的進程,IO限制或CPU限制? –