最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python多核處理器算力浪費問題解決

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

前言

我們都知道python因為其GIL鎖導致每一個線程被綁定到一個核上,導致python無法通過線程實現(xiàn)真正的平行計算。從而導致大量的核算力的浪費。但是

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

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

IO密集型:讀取文件,讀取網絡套接字頻繁。

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

IO密集型

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

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

計算密集型

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

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

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

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

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.

在兩個CPU核心的機器上運行多進程程序,比其他兩個版本都快。這是因為,ProcessPoolExecutor類會利用multiprocessing模塊所提供的底層機制,完成下列操作:

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

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

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

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

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

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

7)對運行的結果進行序列化操作,將其轉變成字節(jié)。

8)將這些字節(jié)通過socket復制到主進程之中。

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

10)最后,把每個子進程所求出的計算結果合并到一份列表之中,并返回給調用者。

multiprocessing開銷比較大,原因就在于:主進程和子進程之間通信,必須進行序列化和反序列化的操作。

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

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 )

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

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

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

使用時ProcessPoolExecutor,此方法將iterables切割 為多個塊,并將其作為單獨的任務提交給池??梢酝ㄟ^將chunksize設置為正整數(shù)來指定這些塊的(近似)大小。對于很長的iterables,采用大值CHUNKSIZE可以顯著改善性能相比的1.默認大小 ThreadPoolExecutor,CHUNKSIZE沒有效果。

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

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

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

如果使用with語句,則可以避免必須顯式調用此方法 ,該語句將關閉Executor (等待,就像Executor.shutdown()使用wait set 調用一樣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多核處理器算力浪費現(xiàn)象處理的詳細內容,更多關于python多核處理器算力浪費的資料請關注腳本之家其它相關文章!

相關文章

  • python 基于opencv操作攝像頭

    python 基于opencv操作攝像頭

    這篇文章主要介紹了python 基于opencv操作攝像頭的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python爬蟲 scrapy框架爬取某招聘網存入mongodb解析

    Python爬蟲 scrapy框架爬取某招聘網存入mongodb解析

    這篇文章主要介紹了Python爬蟲 scrapy框架爬取某招聘網存入mongodb解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python輸入若干整數(shù)求和方式

    Python輸入若干整數(shù)求和方式

    這篇文章主要介紹了Python輸入若干整數(shù)求和方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python中的logging模塊的簡單應用和高級使用

    python中的logging模塊的簡單應用和高級使用

    在?Python?中,可以使用內置的?logging?模塊來記錄應用程序的信息,logging?模塊還提供了一些高級功能,如日志回溯、日志輪換、日志緩沖等,需要的朋友可以參考下
    2023-04-04
  • 如何利用Python模擬GitHub登錄詳解

    如何利用Python模擬GitHub登錄詳解

    這篇文章主要給大家介紹了關于如何利用Python模擬GitHub登錄的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • 深入淺析ImageMagick命令執(zhí)行漏洞

    深入淺析ImageMagick命令執(zhí)行漏洞

    ImageMagick是一個功能強大的開源圖形處理軟件,可以用來讀、寫和處理超過90種的圖片文件,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。接下來通過本文給大家淺析ImageMagick命令執(zhí)行漏洞的知識,一起看看吧
    2016-10-10
  • 使用Python打造高效的PDF文件管理應用

    使用Python打造高效的PDF文件管理應用

    在日常工作和學習中,我們經常需要處理大量PDF文件,本文將使用Python的wxPython和PyMuPDF庫,開發(fā)一個強大且易用的PDF文件管理工具,需要的可以參考下
    2024-12-12
  • python中屏蔽輸出示例詳解

    python中屏蔽輸出示例詳解

    python中屏蔽輸出包含屏蔽標準輸出(比如打印出來的內容)、屏蔽標準錯誤(錯誤信息)還有屏蔽logging信息等,這篇文章主要介紹了python中屏蔽輸出,需要的朋友可以參考下
    2024-05-05
  • 解決keras GAN訓練是loss不發(fā)生變化,accuracy一直為0.5的問題

    解決keras GAN訓練是loss不發(fā)生變化,accuracy一直為0.5的問題

    這篇文章主要介紹了解決keras GAN訓練是loss不發(fā)生變化,accuracy一直為0.5的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python+matplotlib實現(xiàn)簡單曲線的繪制

    Python+matplotlib實現(xiàn)簡單曲線的繪制

    Matplotlib是Python的繪圖庫,它能讓使用者很輕松地將數(shù)據(jù)圖形化,并且提供多樣化的輸出格式。本文將利用matplotlib繪制簡單的曲線圖,感興趣的朋友可以學習一下
    2022-04-04

最新評論

新河县| 阿鲁科尔沁旗| 成都市| 南康市| 宁德市| 泽库县| 凉山| 扎囊县| 方城县| 娱乐| 定陶县| 丰镇市| 微山县| 钟山县| 安塞县| 尚志市| 泽普县| 松江区| 乃东县| 微博| 七台河市| 双牌县| 涟源市| 弋阳县| 郯城县| 云梦县| 泸州市| 济源市| 普兰店市| 日照市| 杨浦区| 交口县| 恭城| 元阳县| 吉木乃县| 英吉沙县| 高州市| 大足县| 玛多县| 洪江市| 吉林市|