日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

分享一个简单易用的python并行模块【PP模块】

發布時間:2023/12/8 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分享一个简单易用的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 pp

2.開啟服務

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模块】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。