av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

python - 如何利用多進程來解決循環(huán)嵌套速度不行的問題?

瀏覽:92日期:2022-06-29 16:08:47

問題描述

有一個循環(huán)里面套循環(huán)的模式,在內(nèi)循環(huán)的循環(huán)體內(nèi)要同時用到大循環(huán)和小循環(huán)的變量。

我這里是簡化成了一個簡單的模型,這種模式如果函數(shù)復(fù)雜的話速度超級慢,想問一下如何使用多進程的辦法來解決速度問題?

我的思路是,只對小循環(huán)采用多進程,在大循環(huán)的循環(huán)體內(nèi)寫多進程的代碼,但是一直失敗,求大神給出正確的代碼。

拜謝!

import random as rlist1=list(range(100))i=0reslist=[]while i<2000:#大循環(huán) alist=[]#三個列表變量,每次循環(huán)開始時清空 blist=[] clist=[] for each in list1:#小循環(huán)x=r.randint(i+30,i+60)+each#涉及到大、小循環(huán)變量的幾個函數(shù),這里用random示意y=r.randint(i+60,i+120)+eachz=r.randint(i+60,i+180)+eachres=2.5*x-y-zreslist.append(res)#對函數(shù)結(jié)果進行操作if res>=50: alist.append(each)if -50<res<50: blist.append(each)if res<=-50: clist.append(each)for each in alist:#在大循環(huán)中對小循環(huán)中得出的結(jié)果進行進一步其他操作print(each) for each in blist:print(each) for each in clist:print(each)i+=1

問題解答

回答1:

首先,并行計算需要各個并行運算的子程序間沒有相互因果關(guān)系。小循環(huán)內(nèi),res與x,y,z,與alist,blist,clist,都是因果關(guān)系密切的,很難拆分并行計算。題主貼上來的雖然不是原始代碼,不知道原始代碼里大循環(huán)間有沒有因果關(guān)系,不過從示意代碼來看,把大循環(huán)拆分為N個線程(用不到進程吧)應(yīng)該是可以的,每個線程計算2000/N次。例如,分為8個線程,線程1計算i=0到249,線程2計算i=250到499,依次類推。。。這里N的大小,可以根據(jù)CPU的核數(shù)來定,如果N超過CPU的核數(shù),就沒有太大意義了,反而有可能會降低效率。

回答2:

中間應(yīng)該用elif吧,最后面for的縮進好像也有問題

回答3:

可以在大循環(huán)這里開多進程,比如大循環(huán)2000次,如CPU的核數(shù)是4,則開4個進程,每個進程負責(zé)運行500個

小循環(huán)結(jié)束后,可以開子線程去執(zhí)行下面的這些后續(xù)操作,大循環(huán)繼續(xù)往前處理

for each in alist:#在大循環(huán)中對小循環(huán)中得出的結(jié)果進行進一步其他操作 print(each)for each in blist: print(each)for each in clist: print(each)回答4:

可以將小循環(huán)用子進程去處理 不過這樣 你需要兩個大循環(huán)。一個循環(huán)處理小循環(huán) ,等處理完這個循環(huán)在來個大循環(huán)處理后面的事情

像這樣

import random as rdef cumput(i, list1): alist = [] blist = [] clist = [] reslist = [] for each in list1: # 小循環(huán)x = r.randint(i + 30, i + 60) + each # 涉及到大、小循環(huán)變量的幾個函數(shù),這里用random示意y = r.randint(i + 60, i + 120) + eachz = r.randint(i + 60, i + 180) + eachres = 2.5 * x - y - zreslist.append(res) # 對函數(shù)結(jié)果進行操作if res >= 50: alist.append(each)if -50 < res < 50: blist.append(each)if res <= -50: clist.append(each) return alist, blist, clist, reslistif __name__ == ’__main__’: multiprocessing.freeze_support() list1 = list(range(100)) i = 0 pool = multiprocessing.Pool(2) res = {} while i < 2000: # 大循環(huán)res[i]=pool.apply_async(cumput, (i, list1,))i += 1 pool.close() pool.join() for i in res:for each in res[i].get()[0]: # 在大循環(huán)中對小循環(huán)中得出的結(jié)果進行進一步其他操作 print(each)for each in res[i].get()[1]: print(each)for each in res[i].get()[2]: print(each)回答5:

如果小循環(huán)中執(zhí)行的函數(shù)比較耗時的話可以考慮生產(chǎn)者-消費者模型

import randomfrom threading import Threadfrom Queue import Queueresqueue = Queue()aqueue = Queue()bqueue = Queue()cqueue = Queue()def producer(): list1=list(range(100))for _ in range(2000):for each in list1: x=r.randint(i+30,i+60)+each y=r.randint(i+60,i+120)+each z=r.randint(i+60,i+180)+eachres=2.5*x-y-z resqueue.put(res)if res>=50:aqueue.put(each) if -50<res<50:bqueue.put(each) if res<=-50:cqueue.put(each)def consumer_a(): while True:try: data = aqueue.get(timeout=5)except Queue.Empty: returnelse: # 耗時操作 deal_data(data) aqueue.task_done() def consumer_b(): while True:try: data = bqueue.get(timeout=5)except Queue.Empty: returnelse: # 耗時操作 deal_data(data) bqueue.task_done() def consumer_c(): while True:try: data = cqueue.get(timeout=5)except Queue.Empty: returnelse: # 耗時操作 deal_data(data) cqueue.task_done() def consumer_res(): while True:try: data = resqueue.get(timeout=5)except Queue.Empty: returnelse: # 耗時操作 deal_data(data) resqueue.task_done() if __name__ == '__main__': t1 = Thread(target=producer) t2 = Thread(target=consumer_a) ...t1.start() t2.start() 回答6:

題主是不是應(yīng)該先設(shè)計好進程的輸入與輸出,多進程做并行計算的話進程之間的通信是最重要的,據(jù)我了解的應(yīng)該是MPI,比如多層循環(huán),應(yīng)該是先分發(fā)部分數(shù)據(jù)到每個進程,每個進程做計算后再返回數(shù)據(jù)整合點,然后合并結(jié)果輸出。

還有一個比較重要的點是估算每個進程的執(zhí)行時間,畢竟有進程間的通信的話等待時間也會導(dǎo)致效率下降。

@一代鍵客 所說,你的嵌套不太符合并行計算的輸入規(guī)則,可以看看這個例子

http://blog.csdn.net/zouxy09/...

之前測試過文中的例子,沒啥問題,你沿著這些做的話應(yīng)該是可以搞出來的

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: av一区二区三区 | 97人澡人人添人人爽欧美 | 国产视频导航 | 亚洲欧美一区二区三区情侣bbw | a在线视频| 亚洲一区二区三区免费视频 | 成人久久一区 | 狠狠的干 | 在线一区二区三区 | 黄色av网站在线免费观看 | 伊人影院在线观看 | www.久久久久久久久 | 99久久精品国产一区二区三区 | 成年人在线观看 | 国产精品一区二区在线观看 | 欧美久久精品一级c片 | 国产一区不卡 | 密室大逃脱第六季大神版在线观看 | 在线一级片 | 黄色网址大全在线观看 | 国产福利视频 | 欧美a级成人淫片免费看 | 日韩www| 欧美九九九 | 欧美综合久久 | 欧美激情在线一区二区三区 | 在线国产精品一区 | 亚洲成人在线网 | 久久久高清| 九九爱这里只有精品 | 天天搞天天操 | 成人精品国产一区二区4080 | 亚洲喷水 | 国产女人与拘做受免费视频 | 久久一日本道色综合久久 | 日韩欧美在线播放 | 国产精品日韩欧美 | 成av人电影在线 | 一区二区三区av | 国产sm主人调教女m视频 | 午夜免费视频观看 |