生活随笔
收集整理的這篇文章主要介紹了
Python串行运算、并行运算、多线程、多进程对比实验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python發揮不了多核處理器的性能(據說是受限于GIL,被鎖住只能用一個CPU核心,關于這個,這里有篇文章),但是可以通過Python的multiprocessing(多進程)模塊或者并行運算模塊(例如,pprocess)來使用到多核。
測試代碼如下,程序先后分別測試了串行運算、并行運算以及多線程和多進程執行同一個函數所花費的時間。
view plaincopy to clipboardprint?
??????import?time??import?pprocess???import?threading??from?multiprocessing?import?Process?????def?takeuptime(n):??????chars?=?'abcdefghijklmnopqrstuvwxyz0123456789'??????s?=?chars?*?1000??????for?i?in?range(10*n):??????????for?c?in?chars:??????????????s.count(c)????if?__name__?==?'__main__':??????list_of_args?=?[1000,?1000,?1000,?1000]??????????????start?=?time.time()??????serial_results?=?[takeuptime(args)?for?args?in?list_of_args]??????print?"%f?s?for?traditional,?serial?computation."?%?(time.time()?-?start)??????????????nproc?=?4???????results?=?pprocess.Map(limit=nproc,?reuse=1)??????parallel_function?=?results.manage(pprocess.MakeReusable(takeuptime))??????start?=?time.time()????????????for?args?in?list_of_args:??????????parallel_function(args)??????parallel_results?=?results[:]??????print?"%f?s?for?parallel?computation."?%?(time.time()?-?start)??????????????nthead?=?4???????threads?=?[threading.Thread(target=takeuptime,?args=(list_of_args[i],))?for?i?in?range(nthead)]??????start?=?time.time()????????????for?thread?in?threads:??????????thread.start()????????????for?thread?in?threads:??????????thread.join()??????print?"%f?s?for?multithreading?computation."?%?(time.time()?-?start)????????????????process?=?[]??????nprocess?=?4???????for?i?in?range(nprocess):??????????process.append(Process(target=takeuptime,?args=(list_of_args[i],)))??????start?=?time.time()????????????for?p?in?process:??????????p.start()????????????for?i?in?process:??????????p.join()??????print?"%f?s?for?multiprocessing?computation."?%?(time.time()?-?start)??
運行結果如下:
[root@localhost test]# python test.py
62.452934 s for traditional, serial computation.
20.665276 s for parallel computation.
64.835923 s for multithreading computation.
18.392281 s for multiprocessing computation.
從測試結果可以明顯看出并行運算和多進程計算速度明顯要快于串行計算和多線程計算。
?
這里有個問題,為什么多線程的所花的時間不比串行單線程的少呢(64.873760 > 62.452934)?
根據我們的常規經驗,多線程肯定要比單線程要快,為什么測試結果卻不是這樣呢?
前面已經提到了,Python只能用到一個CPU核心,因此即便是多線程,在同一時間CPU也只能處理一個線程運算,多個線程并不能并行的運行,他們是輪流切換執行的。
因此,只有當線程中會出現阻塞時,多線程才有意義,比如線程中有數據下載,在等待數據返回時線程阻塞了,此時CPU就可以來處理其它線程的運算。
上面測試程序中的takeuptime()函數沒有阻塞,它不停地在進行著運算,所以多線程和單線程的效果是一樣的(線程切換也會花費時間,所以此時多線程花費的時候甚至比單線程多一些)。
并行運算和多進程運算之所以快,就是因為他們能同時利用多個CPU核心,多個數據運算能同時進行。
我們把takeuptime()函數改成有阻塞的,再測試一下:
view plaincopy to clipboardprint?
def?takeuptime(n):??????def?download(url):????????????????????time.sleep(2)??????for?i?in?range(5):??????????html?=?download('http://www.redicecn.com/page%d.html'?%?i)??
新的運行結果如下:
[root@localhost test]# python test.py
39.996438 s for traditional, serial computation.
10.003863 s for parallel computation.
10.003480 s for multithreading computation.
10.008936 s for multiprocessing computation.
可以看到在有阻塞的數據處理過程中,多線程的作用還是很明顯的。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Python串行运算、并行运算、多线程、多进程对比实验的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。