如何提高Python程序運行效率:基於多進程multiprocessing模塊

Python版本:3.70;操作系統:Windows10

(出發點:通過multiprocessing模塊用最簡單的方式來讓你提高程序運行效率)

來了更好的感受到multiprocessing模塊提升運行效率的效果,將提出一個問題,並採用兩種不同解決方式進行對比來說明。

需解決問題:計算變量i從0開始,不斷+1,直到i=20000000,並重復3次。

(一)普通情況

import time

def hello(num):
    i = 0
    while i < num:
        i+=1
    print(i)

if __name__ ==  '__main__':
    ts = time.time()
    hello(20000000) # 第一次計算
    hello(20000000) # 第二次計算
    hello(20000000) # 第三次計算
    te = time.time()
    print("using time: "+str(te - ts)+"s")

運行結果:

(二)使用multiprocessing模塊

import multiprocessing
import time

def hello(num):
    i = 0
    while i < num:
        i+=1
    print(i)

if __name__ ==  '__main__':
    ts = time.time()
    i = 3
    while i >= 1:
        p = multiprocessing.Process(target=hello,args=(20000000, )) # target=需調用函數名,args=函數參數
        p.start() # 啓動進程
        i-=1
    p.join()
    te = time.time()
    print("using time: "+str(te - ts)+"s")

運行結果:

注意事項:

1、如果是windows系統, multiprocessing.Process需在if __name__ ==  '__main__':下使用

2、args後面的參數必須是tuple類型,在這裏可以認爲是爲整數參數20000000添加了小括號和逗號

3、這裏的p.join()的對象是在while循環中i=1時的p,也就是最後一次循環的p,所以這裏是等待最後一次p結束後,會運行下一條語句,所以如果前面已經開始的進程需要的運行時間比後面的要長得多,就有可能出現串行的情況。比如下圖,我將[4*10000000,0.5*10000000,1*10000000]按順序迭代作爲函數參數輸入,你會發現第一個開始運行的以4*10000000作爲參數的進程卻最後輸出並且還在using time: 1.69600...這條輸出語句的下面

這是因爲4*10000000的計算量遠大於其他兩個(0.5*10000000和1*10000000)的計算量,所以計算花費的時間也比較多。因此,在最後一條語句(1*10000000)計算完成後,p.join()就識別出此時的p函數(以1*10000000爲參數的函數)結束了,可以進行下一條語句了,所以就輸出了using time: 1.69600...,但第一個p函數(以4*10000000爲參數的函數,即第一條開始的進程)還在計算中,所以就出現了串行現象

所以,如果你想要讓你規定的全部進程結束的後再進行下一條語句,就需要使用multiprocessing模塊的進程池。關於進程池我將在另一片文章分享,請大家持續關注。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章