為什麼Python程序不怎麼佔用CPU資源?

只是個人感覺,寫一些computationally intense的代碼,C++的版本很快,而Python的版本會慢得多。但是比較奇怪的一點在於,Python版本一般不會佔用全部CPU資源,而C++的就是100%,有沒有什麼辦法讓Python code更有效地調用CPU資源?(在Python框架內,不考慮Cython或者Python-C API)


python要想佔滿cpu,不用c擴展的話,就只能搞多進程了。對於需要線程間大量交換數據、適合共享內存的那種計算密集型問題。。。還是放棄python比較明智。當然,很多data-parallel型的數值計算問題,沒必要放棄python寫c擴展,可以考慮numba/theano/numexpr等優化工具。


多用numpy…


早期Python由於GIL原因,不能多線程運算,因此一直以來純Python的模塊很少會有。而C/C++的大多數庫很早就做了多線程。現在Python 2.6以後版本都有了multiprocess模塊,可以多進程,但一般很少有人自己寫多進程……

解決方法有:調支持多線程的模塊;c/c++混合編程;多線程跑;重寫程序。

另外python在循環遍歷之類的操作中速度比較慘,推薦盡量減少循環(用更pythonic的方法實現)或者混合


看癥狀,題主最大的可能是C++版本可能在內部某處調用了多線程,Python在有GIL的情況下,最多也就只能佔滿一核,所以才會有怎麼跑不滿的疑問

上面的答案都說的很好了,要佔滿內核請上cython,捎上nogil:

Search Results · GitHub


這是我用 matplotlib 畫最近全部股票走勢時候的任務截圖。


python有一個全局鎖,一個pyhton程序無論何時只能佔用一個cpu,當然,在這個cpu上,你是可以跑滿100%的,對於現在的多cpu系統,想要充分利用cpu資源,你只能選擇使用多進程技術(多線程也不行哦)。提速的方法有很多,比如編寫c擴張,使用pypy編譯器,還有優化代碼結構等等。


我覺得不佔CPU的都是在IO。


正確的解決方法就是,純計算的問題就應該用C++來寫,然後你好好學習如何將任意兩種編程語言互相打通,以後就再也不會思考這個無聊的問題了。


我一不小心看成了程序員怎麼不吃cpu_(:_」∠)_對不起問主


Python本來就是用來做Casual Work的。要不是大多數CLI Shell的編程語法不夠現代,Python還不如那些Shell呢(人家好歹不會搞個版本大分裂)


不吃CPU,你和的程序有關。。。

還有你需要看這個https://wiki.python.org/moin/GlobalInterpreterLock


C++佔用了100%CPU,你確定程序寫對了?


為什麼不用multiprocessing么?


其實不用一定要用cpu的,如果你的運算含有大量矩陣運算,那麼用gnumpy(沒錯就是這麼寫的不要糾正我),然後你就可以體驗飛一般的感覺了


計算密集型任務的特點是要進行大量的計算,消耗CPU資源。計算密集型任務雖然可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低。

計算密集型任務由於主要消耗CPU資源,因此,代碼運行效率至關重要。Python這樣的腳本語言運行效率很低,完全不適合計算密集型任務。

Python解釋器由於設計時有GIL全局鎖,導致了多線程無法利用多核。所以多線程的Python程序很難佔滿CPU資源,多進程的話效率又不高,所以說對於計算密集型任務,最好用C/C++編寫。


推薦兩個最常用的package

Numpy - NumPy

Pandas - Python Data Analysis Library

基本上常用的數量運算都可以用這兩個庫pythonic的實現,由於這兩個庫的底層是c/c++所以效率也非常高。


把優先順序設高,綁定CPU


推薦閱讀:

假如DNA是一種編程語言,那麼誰能保證人類對DNA的修改沒有bug?
CPU空操作的原理是什麼?
如何評價 VBA 語言?
怎麼評價 Idris 語言?

TAG:編程語言 | Python |