分享一个简单易用的python并行模块【PP模块】
目前個人計算機大都是多核的,但是在運行python程序的時候會發現實際上只有一個核心(CPU)在跑代碼,另外幾個核心都在偷懶呢,如下圖
并行計算的目的是將所有的核心都運行起來以提高代碼的執行速度,在python中由于存在全局解釋器鎖(GIL)如果使用默認的python多線程進行并行計算可能會發現代碼的執行速度并不會加快,甚至會比使用單核心要慢!!!
一些并行模塊通過修改pyhton的GIL機制突破了這個限制,使得Python在多核電腦中也能夠有效的進行并行計算。PP(Parallel Python)模塊就是其中一種。
pp模塊是python的一個輕量級并行模塊,能夠有效提高程序運行效率,使用非常方便。
下面這段測試代碼是計算從0到給定范圍內所有質數的和,即計算0100000,0100100,… ,0~100700這8個范圍內的所有質數的和:
import pp,time,math def isprime(n):"""Returns True if n is prime and False otherwise"""if not isinstance(n, int):raise TypeError("argument passed to is_prime is not of 'int' type")if n < 2:return Falseif n == 2:return Truemax = int(math.ceil(math.sqrt(n)))i = 2while i <= max:if n % i == 0:return Falsei += 1return Truedef sum_pimes(n):"""Calculates sum of all primes below given integer n"""return sum([x for x in range(2, n) if isprime(x)])#串行代碼 print("{beg}串行程序{beg}".format(beg='-'*16)) startTime = time.time()inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700) results = [ (input,sum_primes(input)) for input in inputs ]for input, result in results:print("Sum of primes below %s is %s" % (input, result))print("用時:%.3fs"%( time.time()-startTime ) )#并行代碼 print("{beg}并行程序{beg}".format(beg='-'*16)) startTime = time.time()job_server = pp.Server() inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700) jobs = [(input, job_server.submit(sum_primes, (input, ), (isprime, ),("math", )) ) for input in inputs]for input, job in jobs:print("Sum of primes below %s is %s" % (input, job()))print("用時:%.3fs"%( time.time()-startTime ) )運行效果圖:
由于樓主的電腦是偽4核(實際是2核,由于intel使用了超線程把它變成了4核的樣子),因此效率只是提高了兩倍,不過也還是不錯了~
理論上你的電腦中實際有多少的個核心,通過并行計算就能提高多少被效率(實際的提高倍速會低一點)。
可以看到并行代碼只是比串行代碼多了幾行,然而效率就翻倍了,看到這各位魚油有木有動心呢
下面就開始正式介紹這個模塊了
一:安裝
1.從官網下載對應版本的PP模塊:http://www.parallelpython.com/content/view/18/32/
我的系統是Windows,python版本是3.4.4因此選擇了下面這個版本
2.在解壓目錄下打開命令行,輸入python setup.py install就自動開始安裝了(就是這么簡單)
二:使用
1.導入模塊
import pp2.開啟服務
job_server = pp.Server() #ncpus = 4 #可以自己指定使用的核心數 #job_server = pp.Server(ncpus) #創建服務 #默認為使用全部核心3.提交任務
f1 = job_server.submit(func1, args1, depfuncs1, modules1) #func1: 被并行執行的函數 #args1: func的參數,以元組的形式傳入 #depfuncs1: 被func調用的函數,以元組的形式傳入 #modules1: 函數執行需要調用的模塊,以元組的形式傳入4.獲取結果
r1 = f1()下面根據之前的測試例子解釋下pp模塊的使用
math def isprime(n):if not isinstance(n, int):raise TypeError("argument passed to is_prime is not of 'int' type")if n < 2:return Falseif n == 2:return Truemax = int(math.ceil(math.sqrt(n)))i = 2while i <= max:if n % i == 0:return Falsei += 1return Truedef sum_pimes(n):return sum([x for x in range(2, n) if isprime(x)])主程序
import pp job_server = pp.Server() inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700) jobs = [(input, job_server.submit(sum_primes, (input, ), (isprime, ),("math", )) ) for input in inputs] for input, job in jobs:print("Sum of primes below %s is %s" % (input, job()))第1行:導入pp模塊
第2行:開啟pp服務,沒有填參數表示使用全部核心進行計算
第3行:設定任務,即程序需要計算0100000,0100100,… ,0~100700這8個范圍內的所有質數的和
第4行:是一個列表推導式,它的作用是將inputs中的值傳遞給sum_primes,并且執行job_server.submit函數。
在job_server.submit的參數:
- sum_primes為被并行執行的函數,注意這里不能寫成sum_primes()
- (input,)為sum_primes的參數即100000,100100,…,100700。注意這里要以元組形式傳入,而","是元組的標志,因此括號中的逗號不能漏了
- (isprime,)是sum_primes執行過程中需要用到的函數,以元組形式傳入
- (“math”,)是sum_primes或isprime函數中需要用到的模塊,以元組形式傳入
最后兩行:執行完第四行后得到的jobs列表中的每個元素都是一個二元組即(input,func)的形式。這兩行的意思就是循環調用func,并打印結果。(通過函數調用的方式獲取并行計算結果)
到這里一個使用pp模塊進行并行計算的代碼就實現了(并行計算就是如此簡單)。
隨著任務的需求不同,代碼量也會有所變化,不過基本過程就是以上四步。
總結
以上是生活随笔為你收集整理的分享一个简单易用的python并行模块【PP模块】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一缕黑暗中的火光-----------活
- 下一篇: 摸鱼宝典(一)——贪吃蛇游戏改版:贪吃龙