Python串行运算、并行运算、多线程、多进程对比实验
Python發(fā)揮不了多核處理器的性能(據(jù)說是受限于GIL,被鎖住只能用一個(gè)CPU核心,關(guān)于這個(gè),這里有篇文章),但是可以通過Python的multiprocessing(多進(jìn)程)模塊或者并行運(yùn)算模塊(例如,pprocess)來使用到多核。
測試代碼如下,程序先后分別測試了串行運(yùn)算、并行運(yùn)算以及多線程和多進(jìn)程執(zhí)行同一個(gè)函數(shù)所花費(fèi)的時(shí)間。
view plaincopy to clipboardprint?運(yùn)行結(jié)果如下:
[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.
從測試結(jié)果可以明顯看出并行運(yùn)算和多進(jìn)程計(jì)算速度明顯要快于串行計(jì)算和多線程計(jì)算。
?
這里有個(gè)問題,為什么多線程的所花的時(shí)間不比串行單線程的少呢(64.873760 > 62.452934)?
根據(jù)我們的常規(guī)經(jīng)驗(yàn),多線程肯定要比單線程要快,為什么測試結(jié)果卻不是這樣呢?
前面已經(jīng)提到了,Python只能用到一個(gè)CPU核心,因此即便是多線程,在同一時(shí)間CPU也只能處理一個(gè)線程運(yùn)算,多個(gè)線程并不能并行的運(yùn)行,他們是輪流切換執(zhí)行的。
因此,只有當(dāng)線程中會(huì)出現(xiàn)阻塞時(shí),多線程才有意義,比如線程中有數(shù)據(jù)下載,在等待數(shù)據(jù)返回時(shí)線程阻塞了,此時(shí)CPU就可以來處理其它線程的運(yùn)算。
上面測試程序中的takeuptime()函數(shù)沒有阻塞,它不停地在進(jìn)行著運(yùn)算,所以多線程和單線程的效果是一樣的(線程切換也會(huì)花費(fèi)時(shí)間,所以此時(shí)多線程花費(fèi)的時(shí)候甚至比單線程多一些)。
并行運(yùn)算和多進(jìn)程運(yùn)算之所以快,就是因?yàn)樗麄兡芡瑫r(shí)利用多個(gè)CPU核心,多個(gè)數(shù)據(jù)運(yùn)算能同時(shí)進(jìn)行。
我們把takeuptime()函數(shù)改成有阻塞的,再測試一下:
view plaincopy to clipboardprint?新的運(yùn)行結(jié)果如下:
[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.
可以看到在有阻塞的數(shù)據(jù)處理過程中,多線程的作用還是很明顯的。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Python串行运算、并行运算、多线程、多进程对比实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 并发编程之使用多线程和多处
- 下一篇: python实现自顶向下,自底向上