国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python 多核并行計算的示例代碼

2020-02-16 10:36:30
字體:
供稿:網(wǎng)友

以前寫點小程序其實根本不在乎并行,單核跑跑也沒什么問題,而且我的電腦也只有雙核四個超線程(下面就統(tǒng)稱核好了),覺得去折騰并行沒啥意義(除非在做IO密集型任務(wù))。然后自從用上了32核128GB內(nèi)存,看到 htop 里面一堆空載的核,很自然地就會想這個并行必須去折騰一下。后面發(fā)現(xiàn),其實 Python 的并行真的非常簡單。

multiprocessing vs threading

Python 自帶的庫又全又好用,這是我特別喜歡 Python 的原因之一。Python 里面有 multiprocessing和 threading 這兩個用來實現(xiàn)并行的庫。用線程應(yīng)該是很自然的想法,畢竟(直覺上)開銷小,還有共享內(nèi)存的福利,而且在其他語言里面線程用的確實是非常頻繁。然而,我可以很負(fù)責(zé)任的說,如果你用的是 CPython 實現(xiàn),那么用了 threading 就等同于和并行計算說再見了(實際上,甚至?xí)葐尉€程更慢),除非這是個IO密集型的任務(wù)。

GIL

CPython 指的是 python.org 提供的 Python 實現(xiàn)。是的,Python 是一門語言,它有各種不同的實現(xiàn),比如 PyPy, Jython, IronPython 等等……我們用的最多的就是 CPython,它幾乎就和 Python 畫上了等號。

CPython 的實現(xiàn)中,使用了 GIL 即全局鎖,來簡化解釋器的實現(xiàn),使得解釋器每次只執(zhí)行一個線程中的字節(jié)碼。也就是說,除非是在等待IO操作,否則 CPython 的多線程就是徹底的謊言!

有關(guān) GIL 下面兩個資料寫的挺好的:

    http://cenalulu.github.io/python/gil-in-python/ http://www.dabeaz.com/python/UnderstandingGIL.pdf

multiprocessing.Pool

因為 GIL 的緣故 threading 不能用,那么我們就好好研究研究 multiprocessing。(當(dāng)然,如果你說你不用 CPython,沒有 GIL 的問題,那也是極佳的。)

首先介紹一個簡單粗暴,非常實用的工具,就是 multiprocessing.Pool。如果你的任務(wù)能用 ys = map(f, xs) 來解決,大家可能都知道,這樣的形式天生就是最容易并行的,那么在 Python 里面并行計算這個任務(wù)真是再簡單不過了。舉個例子,把每個數(shù)都平方:

import multiprocessingdef f(x):  return x * xcores = multiprocessing.cpu_count()pool = multiprocessing.Pool(processes=cores)xs = range(5)# method 1: mapprint pool.map(f, xs) # prints [0, 1, 4, 9, 16]# method 2: imapfor y in pool.imap(f, xs):  print y      # 0, 1, 4, 9, 16, respectively# method 3: imap_unorderedfor y in pool.imap_unordered(f, xs):  print(y)      # may be in any order

map 直接返回列表,而 i 開頭的兩個函數(shù)返回的是迭代器;imap_unordered 返回的是無序的。

當(dāng)計算時間比較長的時候,我們可能想要加上一個進度條,這個時候 i 系列的好處就體現(xiàn)出來了。另外,有一個小技巧,就是輸出 /r 可以使得光標(biāo)回到行首而不換行,這樣就可以制作簡易的進度條了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 仙游县| 城步| 玉树县| 凌源市| 绍兴市| 尚志市| 乾安县| 红桥区| 马尔康县| 准格尔旗| 日喀则市| 宁都县| 都匀市| 左云县| 辉县市| 泾川县| 板桥市| 上杭县| 绍兴县| 虎林市| 大丰市| 汾西县| 延庆县| 舟山市| 化德县| 句容市| 通江县| 夏邑县| 清丰县| 乌拉特前旗| 余姚市| 嘉祥县| 化隆| 商河县| 黔江区| 安义县| 镇赉县| 紫阳县| 陇川县| 广丰县| 紫云|