亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python多核處理器算力浪費(fèi)問(wèn)題解決

 更新時(shí)間:2022年06月13日 14:24:52   作者:Tim在路上  
這篇文章主要為大家介紹了python多核處理器算力浪費(fèi)現(xiàn)象的處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

我們都知道python因?yàn)槠銰IL鎖導(dǎo)致每一個(gè)線(xiàn)程被綁定到一個(gè)核上,導(dǎo)致python無(wú)法通過(guò)線(xiàn)程實(shí)現(xiàn)真正的平行計(jì)算。從而導(dǎo)致大量的核算力的浪費(fèi)。但是

concurrent.futures模塊,可以利用multiprocessing實(shí)現(xiàn)真正的平行計(jì)算。

但是在提高python的計(jì)算性能前,首先要明白自己的程序目前是什么類(lèi)型? 對(duì)于不同類(lèi)型的程序,如果安裝下述方法進(jìn)行改造,可能效率并不會(huì)提高。

IO密集型:讀取文件,讀取網(wǎng)絡(luò)套接字頻繁。

計(jì)算密集型:大量消耗CPU的數(shù)學(xué)與邏輯運(yùn)算,也就是我們這里說(shuō)的平行計(jì)算。

IO密集型

可以使用asyncio 來(lái)進(jìn)行優(yōu)化,jit的原理是編譯為機(jī)器碼執(zhí)行,但是io中可能會(huì)存在異常字符,所以也不推薦使用,當(dāng)然在存在多態(tài)主機(jī)的情況下,可以采用分布式編程來(lái)提高效率,或者過(guò)concurrent.futures模塊來(lái)實(shí)現(xiàn)。

詳情請(qǐng)看下一篇博文 python 性能的優(yōu)化

計(jì)算密集型

當(dāng)然我們可以使用jit,分布式編程,python 調(diào)用c編程來(lái)優(yōu)化性能,但是要充分利用計(jì)算機(jī)的核數(shù),可以通過(guò)concurrent.futures模塊來(lái)實(shí)現(xiàn),其在實(shí)現(xiàn)提高并行計(jì)算能力時(shí)時(shí)通過(guò)多進(jìn)程實(shí)現(xiàn)。

該concurrent.futures模塊提供了一個(gè)用于異步執(zhí)行callables的高級(jí)接口。

可以使用線(xiàn)程,使用ThreadPoolExecutor或單獨(dú)的進(jìn)程 來(lái)執(zhí)行異步執(zhí)行 ProcessPoolExecutor。兩者都實(shí)現(xiàn)相同的接口,由抽象Executor類(lèi)定義。

concurrent.futures會(huì)以子進(jìn)程的形式,平行的運(yùn)行多個(gè)python解釋器,從而令python程序可以利用多核CPU來(lái)提升執(zhí)行速度。由于子進(jìn)程與主解釋器相分離,所以他們的全局解釋器鎖也是相互獨(dú)立的。每個(gè)子進(jìn)程都能夠完整的使用一個(gè)CPU內(nèi)核。

def gcd(pair):
    a, b = pair
    low = min(a, b)
    for i in range(low, 0, -1):
        if a % i == 0 and b % i == 0:
            return i
numbers = [
    (1963309, 2265973), (1879675, 2493670), (2030677, 3814172),
    (1551645, 2229620), (1988912, 4736670), (2198964, 7876293)
]
import time
start = time.time()
results = list(map(gcd, numbers))
end = time.time()
print 'Took %.3f seconds.' % (end - start)
Took 2.507 seconds.
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, Executor
start = time.time()
pool = ProcessPoolExecutor(max_workers=2)
results = list(pool.map(gcd, numbers))
end = time.time()
print 'Took %.3f seconds.' % (end - start)
Took 1.861 seconds.

在兩個(gè)CPU核心的機(jī)器上運(yùn)行多進(jìn)程程序,比其他兩個(gè)版本都快。這是因?yàn)椋琍rocessPoolExecutor類(lèi)會(huì)利用multiprocessing模塊所提供的底層機(jī)制,完成下列操作:

1)把numbers列表中的每一項(xiàng)輸入數(shù)據(jù)都傳給map。

2)用pickle模塊對(duì)數(shù)據(jù)進(jìn)行序列化,將其變成二進(jìn)制形式。

3)通過(guò)本地套接字,將序列化之后的數(shù)據(jù)從煮解釋器所在的進(jìn)程,發(fā)送到子解釋器所在的進(jìn)程。

4)在子進(jìn)程中,用pickle對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行反序列化,將其還原成python對(duì)象。

5)引入包含gcd函數(shù)的python模塊。

6)各個(gè)子進(jìn)程并行的對(duì)各自的輸入數(shù)據(jù)進(jìn)行計(jì)算。

7)對(duì)運(yùn)行的結(jié)果進(jìn)行序列化操作,將其轉(zhuǎn)變成字節(jié)。

8)將這些字節(jié)通過(guò)socket復(fù)制到主進(jìn)程之中。

9)主進(jìn)程對(duì)這些字節(jié)執(zhí)行反序列化操作,將其還原成python對(duì)象。

10)最后,把每個(gè)子進(jìn)程所求出的計(jì)算結(jié)果合并到一份列表之中,并返回給調(diào)用者。

multiprocessing開(kāi)銷(xiāo)比較大,原因就在于:主進(jìn)程和子進(jìn)程之間通信,必須進(jìn)行序列化和反序列化的操作。

submit(fn,* args,** kwargs ) 將可調(diào)用的fn調(diào)度為執(zhí)行, 并返回表示可調(diào)用執(zhí)行的對(duì)象。

fn(*args **kwargs)Future
with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(pow, 323, 1235)
    print(future.result())
map(func,* iterables,timeout = None,chunksize = 1 )

與以下類(lèi)似:map(func, *iterables)

在iterables收集立即而不是懶洋洋地; func以異步方式執(zhí)行,并且可以同時(shí)對(duì)func進(jìn)行多次調(diào)用 。 返回的迭代器引發(fā)一個(gè)concurrent.futures.TimeoutError if next()被調(diào)用,并且在從原始調(diào)用到超時(shí)秒后結(jié)果不可用Executor.map()。 timeout可以是int或float。如果未指定 超時(shí)None,則等待時(shí)間沒(méi)有限制。

如果func調(diào)用引發(fā)異常,則在從迭代器檢索其值時(shí)將引發(fā)該異常。

使用時(shí)ProcessPoolExecutor,此方法將iterables切割 為多個(gè)塊,并將其作為單獨(dú)的任務(wù)提交給池。可以通過(guò)將chunksize設(shè)置為正整數(shù)來(lái)指定這些塊的(近似)大小。對(duì)于很長(zhǎng)的iterables,采用大值CHUNKSIZE可以顯著改善性能相比的1.默認(rèn)大小 ThreadPoolExecutor,CHUNKSIZE沒(méi)有效果。

在3.5版中更改:添加了chunksize參數(shù)。

shutdown(wait = True ) 向執(zhí)行者發(fā)出信號(hào),表示當(dāng)目前待處理的期貨執(zhí)行完畢時(shí),它應(yīng)該釋放它正在使用的任何資源。關(guān)機(jī)后撥打電話(huà)Executor.submit()和撥打電話(huà) Executor.map()將會(huì)提出RuntimeError。

如果等待是True那么這種方法將不會(huì)返回,直到所有懸而未決的期貨執(zhí)行完畢,并與執(zhí)行相關(guān)的資源已被釋放。如果等待,F(xiàn)alse那么此方法將立即返回,并且當(dāng)執(zhí)行所有未決期貨時(shí),將釋放與執(zhí)行程序關(guān)聯(lián)的資源。無(wú)論wait的值如何,整個(gè)Python程序都不會(huì)退出,直到所有待處理的期貨都執(zhí)行完畢。

如果使用with語(yǔ)句,則可以避免必須顯式調(diào)用此方法 ,該語(yǔ)句將關(guān)閉Executor (等待,就像Executor.shutdown()使用wait set 調(diào)用一樣True):

import shutil
with ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src4.txt', 'dest4.txt')

以上就是python多核處理器算力浪費(fèi)現(xiàn)象處理的詳細(xì)內(nèi)容,更多關(guān)于python多核處理器算力浪費(fèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論