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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python串行运算、并行运算、多线程、多进程对比实验

發(fā)布時(shí)間:2025/6/15 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python串行运算、并行运算、多线程、多进程对比实验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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?
  • #!?/usr/local/bin/python2.7??
  • #?test.py??
  • ??
  • import?time??
  • import?pprocess?#?該模塊只能在linux下使用??
  • 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]??
  • ??
  • ????#?Serial?computation??
  • ????start?=?time.time()??
  • ????serial_results?=?[takeuptime(args)?for?args?in?list_of_args]??
  • ????print?"%f?s?for?traditional,?serial?computation."?%?(time.time()?-?start)??
  • ??
  • ????#?Parallel?computation??
  • ????nproc?=?4?#?maximum?number?of?simultaneous?processes?desired??
  • ????results?=?pprocess.Map(limit=nproc,?reuse=1)??
  • ????parallel_function?=?results.manage(pprocess.MakeReusable(takeuptime))??
  • ????start?=?time.time()??
  • ????#?Start?computing?things??
  • ????for?args?in?list_of_args:??
  • ????????parallel_function(args)??
  • ????parallel_results?=?results[:]??
  • ????print?"%f?s?for?parallel?computation."?%?(time.time()?-?start)??
  • ??
  • ????#?Multithreading?computation??
  • ????nthead?=?4?#?number?of?threads??
  • ????threads?=?[threading.Thread(target=takeuptime,?args=(list_of_args[i],))?for?i?in?range(nthead)]??
  • ????start?=?time.time()??
  • ????#?Start?threads?one?by?one??
  • ????for?thread?in?threads:??
  • ????????thread.start()??
  • ????#?Wait?for?all?threads?to?finish??
  • ????for?thread?in?threads:??
  • ????????thread.join()??
  • ????print?"%f?s?for?multithreading?computation."?%?(time.time()?-?start)??
  • ??
  • ??
  • ????#?Multiprocessing?computation??
  • ????process?=?[]??
  • ????nprocess?=?4?#?number?of?processes??
  • ????for?i?in?range(nprocess):??
  • ????????process.append(Process(target=takeuptime,?args=(list_of_args[i],)))??
  • ????start?=?time.time()??
  • ????#?Start?processes?one?by?one??
  • ????for?p?in?process:??
  • ????????p.start()??
  • ????#?Wait?for?all?processed?to?finish??
  • ????for?i?in?process:??
  • ????????p.join()??
  • ????print?"%f?s?for?multiprocessing?computation."?%?(time.time()?-?start)??
  • 運(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?
  • def?takeuptime(n):??
  • ????def?download(url):??
  • ????????#?simulate?downloading??
  • ????????time.sleep(2)??
  • ????for?i?in?range(5):??
  • ????????html?=?download('http://www.redicecn.com/page%d.html'?%?i)??
  • 新的運(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。