1. 程式人生 > >分享一個簡單易用的python並行模組【PP模組】

分享一個簡單易用的python並行模組【PP模組】

目前個人計算機大都是多核的,但是在執行python程式的時候會發現實際上只有一個核心(CPU)在跑程式碼,另外幾個核心都在偷懶呢,如下圖

 

平行計算的目的是將所有的核心都執行起來以提高程式碼的執行速度,在python中由於存在全域性直譯器鎖(GIL)如果使用預設的python多執行緒進行平行計算可能會發現程式碼的執行速度並不會加快,甚至會比使用但核心要慢!!!

一些並行模組通過修改pyhton的GIL機制突破了這個限制,使得Python在多核電腦中也能夠有效的進行平行計算。PP(Parallel Python)模組就是其中一種。

pp模組是python的一個輕量級並行模組,能夠有效提高程式執行效率,使用非常方便。

下面這段測試程式碼是計算從0到給定範圍內所有質數的和,即計算0~100000,0~100100,... ,0~100700這8個範圍內的所有質數的和:
  1. import pp,time,math
  2. def isprime(n):
  3.     """Returns True if n is prime and False otherwise"""
  4.     if not isinstance(n, int):
  5.         raise TypeError("argument passed to is_prime is not of 'int' type")
  6.     if n < 2:
  7.         return False
  8.     if n == 2:
  9.         return True
  10.     max = int(math.ceil(math.sqrt(n)))
  11.     i = 2
  12.     while i <= max:
  13.         if n % i == 0:
  14.             return False
  15.         i += 1
  16.     return True
  17. def sum_pimes(n):
  18.     """Calculates sum of all primes below given integer n"""
  19.     return sum([x for x in range(2, n) if isprime(x)])
  20. #序列程式碼
  21. print("{beg}序列程式{beg}".format(beg='-'*16))
  22. startTime = time.time()
  23. inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700)
  24. results = [ (input,sum_primes(input)) for input in inputs ]
  25. for input, result in results:
  26.     print("Sum of primes below %s is %s" % (input, result))
  27. print("用時:%.3fs"%( time.time()-startTime ) )
  28. #並行程式碼
  29. print("{beg}並行程式{beg}".format(beg='-'*16))
  30. startTime = time.time()
  31. job_server = pp.Server()
  32. inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700)
  33. jobs = [(input, job_server.submit(sum_primes, (input, ), (isprime, ),
  34.         ("math", )) ) for input in inputs]
  35. for input, job in jobs:
  36.     print("Sum of primes below %s is %s" % (input, job()))
  37. 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.匯入模組
  1. import pp
複製程式碼
2.開啟服務
  1. job_server = pp.Server() 
  2. #ncpus = 4 #可以自己指定使用的核心數
  3. #job_server = pp.Server(ncpus) #建立服務
  4. #預設為使用全部核心
複製程式碼
3.提交任務
  1. f1 = job_server.submit(func1, args1, depfuncs1, modules1) 
  2. #func1: 被並行執行的函式
  3. #args1: func的引數,以元組的形式傳入
  4. #depfuncs1: 被func呼叫的函式,以元組的形式傳入
  5. #modules1: 函式執行需要呼叫的模組,以元組的形式傳入
複製程式碼
4.獲取結果
  1. r1 = f1()
複製程式碼

下面根據之前的測試例子解釋下pp模組的使用

子程式
  1. math
  2. def isprime(n):
  3.     if not isinstance(n, int):
  4.         raise TypeError("argument passed to is_prime is not of 'int' type")
  5.     if n < 2:
  6.         return False
  7.     if n == 2:
  8.         return True
  9.     max = int(math.ceil(math.sqrt(n)))
  10.     i = 2
  11.     while i <= max:
  12.         if n % i == 0:
  13.             return False
  14.         i += 1
  15.     return True
  16. def sum_pimes(n):
  17.     return sum([x for x in range(2, n) if isprime(x)])
複製程式碼
主程式
  1. import pp
  2. job_server = pp.Server()
  3. inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700)
  4. jobs = [(input, job_server.submit(sum_primes, (input, ), (isprime, ),
  5.         ("math", )) ) for input in inputs]
  6. for input, job in jobs:
  7.     print("Sum of primes below %s is %s" % (input, job()))
複製程式碼
第1行:匯入pp模組
第2行:開啟pp服務,沒有填引數表示使用全部核心進行計算
第3行:設定任務,即程式需要計算0~100000,0~100100,... ,0~100700這8個範圍內的所有質數的和
第4行:是一個列表推導式,它的作用是將inputs中的值傳遞給sum_primes,並且執行job_server.submit函式。

  1. 在job_server.submit的引數:
  2. - sum_primes為被並行執行的函式,注意這裡不能寫成sum_primes()
  3. - (input,)為sum_primes的引數即100000,100100,...,100700。注意這裡要以元組形式傳入,而","是元組的標誌,因此括號中的逗號不能漏了
  4. - (isprime,)是sum_primes執行過程中需要用到的函式,以元組形式傳入
  5. - ("math",)是sum_primes或isprime函式中需要用到的模組,以元組形式傳入
複製程式碼
最後兩行:執行完第四行後得到的jobs列表中的每個元素都是一個二元組即(input,func)的形式。這兩行的意思就是迴圈呼叫func,並列印結果。(通過函式呼叫的方式獲取平行計算結果)
到這裡一個使用pp模組進行平行計算的程式碼就實現了(平行計算就是如此簡單 )。

隨著任務的需求不同,程式碼量也會有所變化,不過基本過程就是以上四步。

相關推薦

分享一個簡單python並行模組PP模組

目前個人計算機大都是多核的,但是在執行python程式的時候會發現實際上只有一個核心(CPU)在跑程式碼,另外幾個核心都在偷懶呢,如下圖  平行計算的目的是將所有的核心都執行起來以提高程式碼的執行速度,在python中由於存在全域性直譯器鎖(GIL)如果使用預設的python多執行緒進行平行計算可能會發現程

php 一個簡單的資料庫類---Medoo

參照: https://packagist.org/packages/catfan/medoo https://medoo.in/doc php關於資料庫操作的工具類有很多, 現在介紹一種相容性較好,比較簡單,上手容易的sql類,Medoo。 對於一些小專案來說完全夠用。 使用M

分享一個簡單的ipv6正則表示式

不太嚴謹效率又高的ipv6正則表示式: ([a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){0,7}::[a-f0-9]{0,

vue-lazyload :一個簡單的 Vue 圖片延遲載入外掛

介紹: vue-lazyload主要應用於圖片延遲載入。包含如下的特點: 小巧輕便,功能強大,易於使用 可以用於載入任何影象型別 支援Vue 1.0和Vue 2.0 理解圖片延遲載入: 當某個網頁中呈現的圖片較多時,由於網路等原因,訪問該網頁時,所有的圖片不會立馬全部

如何實現一個簡單且可靠的訊息佇列框架?

作者:李豔鵬 編輯:Gary 訊息佇列在網際網路領域裡得到了廣泛的應用,它多應用在非同步處理、模組之間的解偶和高併發的消峰等場景,訊息佇列中表現最好的當屬Apache開源專案Kafka,Kafka使用支援高併發的Scala語言開發,利用作業系統的快取原理達到高效能,並且天生具有可分割槽,分散式的特

easyopen——一個簡單的介面開放平臺

easyopen介紹一個簡單易用的介面開放平臺,平臺封裝了常用的引數校驗、結果返回等功能,開發者只需實現業務程式碼即可。easyopen的功能類似於淘寶開放平臺,它的所有介面只提供一個url,通過引數來區分不同業務。這樣做的好處是介面url管理方便了,平臺管理者只需維護好介面引數即可。由於引數的數量是可知的,

unity中的一個簡單的A*尋路演算法類

以前專案中用到了尋路,就寫了個A*尋路的演算法類,感覺還不錯,這裡分享出來。A*演算法的原理網上有很多,這裡只簡單說一下我這個演算法的邏輯:*我的這個演算法裡面沒有關閉列表,因為我會根據地圖資料建立一個對應的節點資料的陣列,每個節點資料記錄自己當前的狀態,是開啟還是關閉的。節

頭像截圖上傳兩種方式(SWFUpload、一個簡單的flash外掛)

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http:

FineBI:一個簡單的自助BI工具

過去,有關企業資料分析的重擔都壓在IT部門,傳統BI分析更多面向的是具有IT背景的人員。但隨著業務分析需求的增加,很多公司都希望為業務使用者提供自助分析服務,將分析工作落實到業務人員手中。但同時,分析工

一個簡單的Http訪問工具類for Android

    前言    去年(2017)參加服務外包省賽的時候,負責App開發的我遇到了一個小難題——Http請求。雖說已經有成熟的HttpUrlConnection庫供使用,但依然感到有些不方便:進行一次簡單的請求並對結果進行處理,需要敲下不少程式碼;多次請求之間其實有很多重複

一個簡單的Linux文字編輯器:nano的安裝與使用

許多狀況下咱們都必要編纂雲主機裡的文字情節,而現時用的比力多的文字編纂器是vim,這個估量許多人都以為很難用,這邊伏筆VPS引薦一

Python刷LeetCode1.TwoSum

class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype:

python刷PAT小結1

題前閒言 乙級的題目的難度基本上是實現一個簡單的基本功能,本次總結的幾題中,部分A+B,A除以B 為簡單題,錘子剪刀布 ,數字黑洞, 月餅為邏輯題。最近基本上以一天2小時,4個題目的進度刷題。不很費神,主要以熟悉語法為目的,不涉及資料結構,以下內容為給自己做筆記為主。

一個基於 .NET Core 2.0 開發的簡單的快速開發框架 - LinFx

LinFx 一個基於 .NET Core 2.0 開發的簡單易用的快速開發框架,遵循領域驅動設計(DDD)規範約束,提供實現事件驅動、事件回溯、響應式等特性的基礎設施。讓開發者享受到正真意義的面向物件設計模式來帶的美感。 LinFx.Extensions Caching、DapperExtensio

分享一個簡單Python GUI程式

from tkinter import * import tkinter.messagebox as messagebox class Application(Frame): def __init__(self, master=None): Fram

C++封裝的日誌模組, 簡單的、靈活、非同步、執行緒安全

nlog 旨在提供一個高度靈活, 簡單易用且速度優良的C++日誌模組, 目前應用方向為Windows桌面端應用程式 傳送門:https://gitee.com/kwok-jh/nlog 特性

Swifter.Json -- 在 .Net 平臺上的一個功能強大,簡單,穩定又不失高效能的 JSON 序列化和反序列化工具。

Swifter.Json Github Wiki 在 .Net 平臺上的一個功能強大,簡單易用,穩定又不失高效能的 JSON 序列

NetModular 新年第一更以及升級指南(打造簡單的.Net Core模組化快速開發框架~)

先給大家拜個晚年,祝大家身體健康,遠離肺炎~ NetModular開源已有一年,在這一年收到了很多建議,框架也變得越來越完善。這次更新包括了從去年年尾到現在所做的更改,感覺更改的內容還是蠻多的,所以記錄一下並提供一個升級指南供大家參考~ 老規矩,先上地址~ 原始碼 GitHub:https://github.

分針網——每日分享:網站性的解讀及提高性幾個技巧

什麽是網站易用性? 引用維基百科上對易用性的解釋:易用性(usability)是一種以使用者為中心的設計概念,易用性設計的重點在於讓產品的設計能夠符合使用者的習慣與需求。以因特網網站的設計為例,希望讓使用者在瀏覽的過程中不會產生壓力或

分享一個PHP調RestFul接口的函數

new highlight ray 參數 true post string 分享 tran /** * [http 調用接口函數] * @Date 2016-07-11 * @Author GeorgeHao * @param string $u