版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
要知道,Python默認(rèn)的自動化只能利用CPU的一個邏輯,如果采用并行計算,那就能夠最大化地利用CPU資源,從而成倍提升大量計算的任務(wù)效率。接下來我就詳細(xì)分析一第一,它們都需要進(jìn)行大量的計算,而計算主要是通過CPU實現(xiàn)的。CPU硬件指標(biāo)CPU度到你想要買的商品。雖然咱們可以使用Python自動化執(zhí)行這些程序,從而減少手動操作時間,但是我們還可以利用CPU的多核特性,讓程序盡可能并行執(zhí)行,發(fā)揮CPU的全部計算能力,提高運行那么接下來,我就來教你怎樣利用Python進(jìn)程庫,來實現(xiàn)程序的并行計算,以及怎要想實現(xiàn)程序的并行計算,需要使用到標(biāo)準(zhǔn)庫中的multiprocessing進(jìn)程庫。你可能會進(jìn)程,是計算機用來描述程序運行狀態(tài)的名詞。一個進(jìn)程在運行時需要消耗一定的資源,CPU的時間、內(nèi)存、設(shè)備I/Omultrocessing接下來,我就以1-100平方為例,看看怎么使用multiprocessing現(xiàn)并行計算。代代123456789frommultiprocessingimport#計算平defreturnwithPool(8asp:#并行計算res=p.map(f,range(1,print(f'計算平方的結(jié)果是在這段代碼中,我通過Pool的map()數(shù)來求1100方計算,由于每次計算平方為了讓map()函數(shù)能夠?qū)崿F(xiàn)并行計算,須在使用它之前,通過Pool()包為它指定并行計算的進(jìn)程數(shù)量,設(shè)置要執(zhí)行的函數(shù)名稱f,以及f()函數(shù)所需參數(shù)。那么接下來,我就帶你學(xué)下我是怎樣使用with語句來設(shè)置函數(shù)的參數(shù),并正確執(zhí)行map()函數(shù)的。首先來看最關(guān)鍵的map()函數(shù),它是Pool包實現(xiàn)并行計算的函數(shù)之一。在代碼中我map()數(shù)賦值了frange數(shù)兩個參數(shù)第一個參數(shù)是函數(shù)對象函數(shù)對象會作為map()函數(shù)創(chuàng)建進(jìn)程以后,即將執(zhí)行的主要任務(wù)。因此,由于這里的含義是指定f對象將要被創(chuàng)建的進(jìn)程執(zhí)行,而不是將f()函數(shù)執(zhí)行的結(jié)果作為新的進(jìn)程執(zhí)行,所以第一個參數(shù)必須使用函數(shù)對象f,而不能使用f()函數(shù)。第二個參數(shù)要求必須是可迭代的對例如我在代碼中需要為f函數(shù)傳遞參數(shù)為1-100的整數(shù),就可以使用range()函數(shù)產(chǎn)生到100的整數(shù)并直接返回,因為它的返回值就是可迭代對象如果參數(shù)不是數(shù)字,就可以采用列表、元組、字典等支持迭代的數(shù)據(jù)類型,代替range()函數(shù),作為f()數(shù)數(shù)。例子果你并行多個的時就可用字典路徑和要調(diào)整的時長,并把這個字典作為map()函數(shù)的二個參數(shù),map()函數(shù)會為字典的每個鍵值對創(chuàng)建一個進(jìn)程來并行處理它們。接下來是map()函數(shù)中的三個主要部分,我來分析一下它們各自在并行計算中的功能。第一,with語句。這是我們在第七講學(xué)習(xí)怎么使用Python打開文件之后,第二次用到with了multsingoolwth語句。也就是說,multsg庫把對進(jìn)程的操作寫在wthwth就會自動處理進(jìn)程的打開和關(guān)閉,這樣在實現(xiàn)并行計算的代碼中,你就不用學(xué)習(xí)進(jìn)程的基本操作,也能減輕你學(xué)習(xí)并發(fā)程序的負(fù)擔(dān)。在了解了with語句可以操作進(jìn)程的打開和關(guān)閉后,我們來看代碼中我是怎么使用with語我在代碼中使用了“wthool(8)spPool()”,表示map()函數(shù)最多同時運行8個進(jìn)程。剩下兩個部分是range()函數(shù)和f()函數(shù)。range()函數(shù)的作用是產(chǎn)生1-100的整數(shù),這些整數(shù)會在每次創(chuàng)建新的進(jìn)程時,依次作為f()函數(shù)的參數(shù)并賦值。而f()函數(shù)得到參數(shù)后,會把計算結(jié)果返回給map()函數(shù)。當(dāng)f()函數(shù)處理完所有的參數(shù)后,map()函數(shù)還會返回一個列表作為運行的結(jié)果,并進(jìn)行輸出。以上就是實現(xiàn)并行計算的主要過一個是為并行程序自動指定并行度。在并行計算的基本方法中,我使用了手動指定并行的方式,來指定進(jìn)程最多能夠運行多少個。不過手動指定的并行度并不能適合所有的電腦,因此就需要根據(jù)計算機的CPU核數(shù)設(shè)置合理的并行度。而且,每臺計算機的CPU資源是固定不變的,那么設(shè)置合理的進(jìn)程數(shù)量能讓你的并行計算任務(wù)充分利用CPU資源。Python我們先來看怎么自動設(shè)置適合你的電腦的并行度為并行程序自動指定并計算類的任務(wù)包括數(shù)字計算、數(shù)據(jù)統(tǒng)計、的編等,都屬于計算密集型應(yīng)用,它們最大的資源開銷就是CPU如果并行度設(shè)置過小,比如運行的進(jìn)程數(shù)量小于邏輯CPU的數(shù)量,就會造成部分CPU因為無法被充分利用而處于閑置狀態(tài)如果并行度設(shè)置過大,由于現(xiàn)代的操作系統(tǒng)為了保證每個進(jìn)程都能公平得到CPU所以會造成CPUCPU還未完成一個進(jìn)程的處理時,就得切換至下一個進(jìn)程進(jìn)行處理,而多進(jìn)程之間來回切換也CPU時間,造成CPU資源的浪費。那并行度該怎么設(shè)置才合理呢?通常情況下,我們會把并行度設(shè)置為邏輯CPU數(shù)量的兩倍。不過假如計算任務(wù)達(dá)到小時級別(這類任務(wù)需要長時間占用CPU源),為了減少切換任務(wù)時的開銷,我建議計算的并行度和邏輯CPU數(shù)量保持相等。這就又有一個問題了,該怎么獲得計算機的邏輯CPU個數(shù)呢?Windows可以通過任務(wù)管理器獲得,MacOS可以監(jiān)視器獲得。如果你希望取得邏輯CPU的個數(shù)之后,以根據(jù)它的數(shù)量自動設(shè)置創(chuàng)建進(jìn)程的數(shù)量,那么可以通過安裝第包psutils,利用其中的cpu_count()函數(shù)取得邏輯CPU個數(shù)。我把并行度自動設(shè)置為當(dāng)前邏輯CPU兩倍的代碼寫在下面,供你參考代代123456789frommultiprocessingimportPool,Queueimportosimport#邏輯cpucount=定義一個隊列用queue=進(jìn)程#用于計算平方和將運行函數(shù)的進(jìn)程id寫入隊defreturnx*xwithPool(count*2asp:#并行計算resp.map(f,range(1101))print(f'計算平方的結(jié)果是并行計算用到的進(jìn)程idpids=set()whilenotqueue.empty():print(f'用到的進(jìn)程id是:在代碼中,我使用了psutil.cpu_count()函數(shù)來獲取邏輯CPU的個數(shù),把“count*2”作為參數(shù)傳Pool(),并以邏輯CPU倍作為最大創(chuàng)建進(jìn)程數(shù)量,從而計算1-100的平方。這里有兩點需要你注意。第一,psutilsprocessandsystemutilities的縮寫,所以它除了獲取邏輯CPU數(shù)量外,還可以獲取內(nèi)存、硬盤、網(wǎng)絡(luò)連接等和操作系統(tǒng)相關(guān)的信息。如果你在工作中需要取得操作系統(tǒng)的運行狀態(tài),就可以采用psutils包。第二,psutils是第庫,因此,在Windows上你需要通過cmd命令行執(zhí)行pip3installpsutil安裝后,才能釋放psutils包,否則會出現(xiàn)模塊無法找到的錯誤。由于map()函數(shù)的第二個參數(shù)可能會被傳入不可迭代對象,這時有可能會導(dǎo)致只運行了一個進(jìn)程,因此我就在多進(jìn)程執(zhí)行過程中,增加了記錄進(jìn)程ID的功能。而在這能中,我使用的是os庫、隊列庫和集合數(shù)據(jù)類型,按照下面三個步驟來實現(xiàn)對所有創(chuàng)建的進(jìn)程ID首先,使用os庫的getpid()函數(shù)獲取進(jìn)程ID由于map()函數(shù)會根據(jù)Pool()類的參數(shù),事先創(chuàng)建好指定數(shù)量的進(jìn)程,而每次運行f()函數(shù)都在創(chuàng)建好的進(jìn)程中執(zhí)行,所以我就采用os庫的getpid()函數(shù)取得運行f()函數(shù)進(jìn)程的唯一標(biāo)識,這就是使用os庫的用途。接下來,使用隊列庫每次運行進(jìn)程的ID為了把每次運行的進(jìn)程ID存到一個對象中,我使用了multiprocessing庫的隊列包。因為在多進(jìn)程的程序中,不能采用標(biāo)準(zhǔn)數(shù)據(jù)類型來傳遞數(shù)據(jù),所以multiprocessing庫還提供了方便進(jìn)程間通信的對象——Queue隊列。map()函數(shù)每執(zhí)行一次f()函數(shù),我就把進(jìn)程ID作為隊列的put()函數(shù)的參數(shù),并把進(jìn)程ID放入隊Queue中,直到所有的f()函數(shù)執(zhí)行完成,隊列里就會記錄每次執(zhí)行的進(jìn)程ID最后,使用集合數(shù)據(jù)類型本次f()函數(shù)運行的所有進(jìn)程ID為了實現(xiàn)這能,我需要通過while循環(huán)結(jié)構(gòu),根據(jù)隊列不為空的條件,把隊列中的進(jìn)程ID使用get()函數(shù)取出來,放入pids變量中。pids是集合數(shù)據(jù)類型,集合是一個無序的不重復(fù)元素序列,需要使用set建。你由于f()函數(shù)會多次在一個進(jìn)程中執(zhí)行,因此在隊列中會記錄重復(fù)的進(jìn)程ID,我把進(jìn)程從隊列中取出后,放入集合數(shù)據(jù)類型中,自己就不用編寫程序,自動把重復(fù)的進(jìn)程ID去了。而且通過對pids的進(jìn)程ID行輸出,可以看到進(jìn)程ID數(shù)量剛好和類指定的并行進(jìn)程數(shù)量相等統(tǒng)計程序運行的我們除了需要掌握判斷程序的并行度外,還可以統(tǒng)計并行計算比順序計算節(jié)省了多少時Python程序運行的時間。在Python中我們可以利用time庫的time()函數(shù),來記錄當(dāng)前時間的功能首先,需要在統(tǒng)計時間代碼的前后各增加一次time.time(數(shù),并把它們統(tǒng)計時間的結(jié)果存放在time1、time2兩個不同的變量中。代123456789#并行計算時間統(tǒng)withPool(4as代123456789#并行計算時間統(tǒng)withPool(4asp:#并行計算time1=res=p.map(f,range(1,10001))time2=time.time()#print(f'計算平方的結(jié)果是print(str(time2-#串行計算時間統(tǒng)list1=time1=foriinrange(1,10001):time2=print(str(time2-在這段代碼中time1time2時間差就可以得到程序運行的時間了,那么根據(jù)運這里你需要注意,由于計算平方的CPU銷較小,比較難體現(xiàn)并行計算的優(yōu)勢,你就可以采用并行網(wǎng)頁,或其他CPU開銷較高的程序,這樣會讓兩個程序的時間差別更加明在最后,我來為你總結(jié)一下實現(xiàn)并行計算的基本方法和三個注通過multiprocessingPool可以實現(xiàn)基于進(jìn)程的并行計算功能,Poolmap()數(shù)會根據(jù)Pool包指定的進(jìn)程數(shù)量實現(xiàn)并行運行。這里還有三點需要你注意:作為map()數(shù)的第一個參數(shù)你需要傳遞函數(shù)f,不能傳遞函數(shù)的調(diào)用f()式,這為了讓并行度更適合你的電腦,應(yīng)該根據(jù)邏輯CPU數(shù)設(shè)置并行度,并根據(jù)運行時間實現(xiàn)并行計算任務(wù)的程序除了使用多進(jìn)程模型外還可以使用多線程模型。多進(jìn)程的并行計算更適用于計算密集型應(yīng)用,即程序運行過程中主要為計算類CPU線程模型適合I/O密集型的應(yīng)用,例如:通過互聯(lián)網(wǎng)進(jìn)行批量網(wǎng)頁和。如果你想將多進(jìn)程的并發(fā)模型改為多線程的并發(fā)模型只需在導(dǎo)入庫的時候“mults”“multsummy”網(wǎng)頁。我將多進(jìn)程和多線程兩種方式導(dǎo)入庫的代碼貼在下方供你參考。代代1234567#多進(jìn)程模frommultiprocessingimport#多線程模frommultiprocessing.dummyimport#multiprocessing.dummy的Pool用法和multiprocessing庫相我把這節(jié)課的相關(guān)代碼放在 上,你可以自行查找、學(xué)習(xí)我為你留一道思考題,有一個軟件包requests,可以requests.get('ht t方式一個,并能夠得到網(wǎng)頁的源代碼。假設(shè)我為你提供了幾十個需要的,你是如何實現(xiàn)這些的并行的,你又能否通過
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025 小學(xué)六年級科學(xué)上冊科學(xué)教育中的傳統(tǒng)文化教育教學(xué)案例課件
- 員工淋浴間衛(wèi)生管理制度
- 肝纖維化術(shù)后個體化抗復(fù)發(fā)治療策略
- 衛(wèi)生院遠(yuǎn)程會診工作制度
- 衛(wèi)生院輻射防護(hù)制度
- 建筑工地衛(wèi)生間規(guī)章制度
- 僑聯(lián)知識講座
- 公文管理條例培訓(xùn)
- 河北省廊坊市2025-2026學(xué)年高二上學(xué)期期末英語試卷(含答案無聽力原文及音頻)
- 2025-2026學(xué)年福建省泉州市永春縣九年級(上)期末道德與法治試卷(含答案)
- 低空經(jīng)濟發(fā)展白皮書-深圳方案
- 員工崗位評估管理制度
- GA/T 2157-2024毛細(xì)管電泳遺傳分析儀
- 工業(yè)機器人技術(shù)基礎(chǔ)電子教案
- 能源與動力工程測試技術(shù) 課件 第十章 轉(zhuǎn)速、轉(zhuǎn)矩及功率測量
- 2025年安徽省中考模擬英語試題(原卷版+解析版)
- 2024-2025學(xué)年云南省昆明市盤龍區(qū)五年級(上)期末數(shù)學(xué)試卷(含答案)
- 論地理環(huán)境對潮汕飲食文化的影響
- 值班人員在崗情況檢查記錄表周一
- 赤峰南臺子金礦有限公司金礦2022年度礦山地質(zhì)環(huán)境治理計劃書
- 徐州市銅山區(qū)法院系統(tǒng)書記員招聘考試真題
評論
0/150
提交評論