㈠ 如何提高python的計算精度
1.round()內置方法
round()如果只有一個數作為參數,不指定位數的時候,返回的是一個整數,而且是最靠近的整數(這點上類似四捨五入)。但是當出現.5的時候,兩邊的距離都一樣,round()取靠近的偶數,這就是為什麼round(2.5) = 2。當指定取捨的小數點位數的時候,一般情況也是使用四捨五入的規則,但是碰到.5的這樣情況,如果要取捨的位數前的小樹是奇數,則直接舍棄,如果偶數這向上取捨。看下面的示例:
>>>round(2.635,2)2.63>>>round(2.645,2)2.65>>>round(2.655,2)2.65>>>round(2.665,2)2.67>>>round(2.675,2)2.672. 使用格式化(效果和round()是一樣的。)
>>> a=("%.2f"%2.635)>>> a'2.63'>>> a=("%.2f"%2.645)>>> a'2.65'>>> a=int(2.5)>>> a2
㈡ python 的運算能力比不上c,進行大量運算時候python比c慢的多,這對嗎
運算能力是一樣的,不過python是動態語言,變數本身帶了類型信息,相同的計算會做更多的操作,所以會慢一些。不過動態語言的是優勢是開發效率,C的是運行效率,如果是不會大量重復使用的小程序的,算開發+運行的總時間的話,python會比C的小很多,而且python的庫很多,內置大整數和decimal模塊,可以計算精度很高的運算。
㈢ Python性能分析指南
原文來源 | Huy Nguyen
譯文來源 | 開源中國
雖然你所寫的每個Python程序並不總是需要嚴密的性能分析,但是當這樣的問題出現時,如果能知道Python生態系統中的許多種工具,這樣總是可以讓人安心的。
分析一個程序的性能可以歸結為回答4個基本的問題:
1.它運行的有多塊?
2.那裡是速度的瓶頸?
3.它使用了多少內存?
4.哪裡發生了內存泄漏?
下面,我們將用一些很酷的工具,深入細節的回答這些問題。
使用time工具粗糙定時
首先,我們可以使用快速然而粗糙的工具:古老的unix工具time,來為我們的代碼檢測運行時間。
上面三個輸入變數的意義在文章 stackoverflow article 中有詳細介紹。簡單的說:
real – 表示實際的程序運行時間
user – 表示程序在用戶態的cpu總時間
sys – 表示在內核態的cpu總時間
通過sys和user時間的求和,你可以直觀的得到系統上沒有其他程序運行時你的程序運行所需要的CPU周期。
若sys和user時間之和遠遠少於real時間,那麼你可以猜測你的程序的主要性能問題很可能與IO等待相關。
使用計時上下文管理器進行細粒度計時
我們的下一個技術涉及訪問細粒度計時信息的直接代碼指令。這是一小段代碼,我發現使用專門的計時測量是非常重要的:
timer.py
為了使用它,你需要用Python的with關鍵字和Timer上下文管理器包裝想要計時的代碼塊。它將會在你的代碼塊開始執行的時候啟動計時器,在你的代碼塊結束的時候停止計時器。
這是一個使用上述代碼片段的例子:
我經常將這些計時器的輸出記錄到文件中,這樣就可以觀察我的程序的性能如何隨著時間進化。
使用分析器逐行統計時間和執行頻率
Robert Kern有一個稱作line_profiler的不錯的項目,我經常使用它查看我的腳步中每行代碼多快多頻繁的被執行。
想要使用它,你需要通過pip安裝該python包:
一旦安裝完成,你將會使用一個稱做「line_profiler」的新模組和一個「kernprof.py」可執行腳本。
想要使用該工具,首先修改你的源代碼,在想要測量的函數上裝飾@profile裝飾器。不要擔心,你不需要導入任何模組。kernprof.py腳本將會在執行的時候將它自動地注入到你的腳步的運行時。
primes.py
一旦你已經設置好了@profile裝飾器,使用kernprof.py執行你的腳步。
-l選項通知kernprof注入@profile裝飾器到你的腳步的內建函數,-v選項通知kernprof在腳本執行完畢的時候顯示計時信息。上述腳本的輸出看起來像這樣:
尋找具有高Hits值或高Time值的行。這些就是可以通過優化帶來最大改善的地方。
程序使用了多少內存?
現在我們對計時有了較好的理解,那麼讓我們繼續弄清楚程序使用了多少內存。我們很幸運,Fabian Pedregosa模仿Robert Kern的line_profiler實現了一個不錯的內存分析器。
首先使用pip安裝:
(這里建議安裝psutil包,因為它可以大大改善memory_profiler的性能)。
就像line_profiler,memory_profiler也需要在感興趣的函數上面裝飾@profile裝飾器:
想要觀察你的函數使用了多少內存,像下面這樣執行:
一旦程序退出,你將會看到看起來像這樣的輸出:
line_profiler和memory_profiler的IPython快捷方式
memory_profiler和line_profiler有一個鮮為人知的小竅門,兩者都有在IPython中的快捷命令。你需要做的就是在IPython會話中輸入以下內容:
在這樣做的時候你需要訪問魔法命令%lprun和%mprun,它們的行為類似於他們的命令行形式。主要區別是你不需要使用@profiledecorator來修飾你要分析的函數。只需要在IPython會話中像先前一樣直接運行分析:
這樣可以節省你很多時間和精力,因為你的源代碼不需要為使用這些分析命令而進行修改。
內存泄漏在哪裡?
cPython解釋器使用引用計數做為記錄內存使用的主要方法。這意味著每個對象包含一個計數器,當某處對該對象的引用被存儲時計數器增加,當引用被刪除時計數器遞減。當計數器到達零時,cPython解釋器就知道該對象不再被使用,所以刪除對象,釋放佔用的內存。
如果程序中不再被使用的對象的引用一直被佔有,那麼就經常發生內存泄漏。
查找這種「內存泄漏」最快的方式是使用Marius Gedminas編寫的objgraph,這是一個極好的工具。該工具允許你查看內存中對象的數量,定位含有該對象的引用的所有代碼的位置。
一開始,首先安裝objgraph:
一旦你已經安裝了這個工具,在你的代碼中插入一行聲明調用調試器:
最普遍的對象是哪些?
在運行的時候,你可以通過執行下述指令查看程序中前20個最普遍的對象:
哪些對象已經被添加或刪除?
我們也可以查看兩個時間點之間那些對象已經被添加或刪除:
誰引用著泄漏的對象?
繼續,你還可以查看哪裡包含給定對象的引用。讓我們以下述簡單的程序做為一個例子:
想要看看哪裡包含變數x的引用,執行objgraph.show_backref()函數:
該命令的輸出應該是一副PNG圖像,保存在/tmp/backrefs.png,它看起來是像這樣:
在運行的時候,你可以通過執行下述指令查看程序中前20個最普遍的對象:最下面有紅字的盒子是我們感興趣的對象。我們可以看到,它被符號x引用了一次,被列表y引用了三次。如果是x引起了一個內存泄漏,我們可以使用這個方法,通過跟蹤它的所有引用,來檢查為什麼它沒有自動的被釋放。
回顧一下,objgraph 使我們可以:
顯示占據python程序內存的頭N個對象
顯示一段時間以後哪些對象被刪除活增加了
在我們的腳本中顯示某個給定對象的所有引用
努力與精度
在本帖中,我給你顯示了怎樣用幾個工具來分析python程序的性能。通過這些工具與技術的武裝,你可以獲得所有需要的信息,來跟蹤一個python程序中大多數的內存泄漏,以及識別出其速度瓶頸。
對許多其他觀點來說,運行一次性能分析就意味著在努力目標與事實精度之間做出平衡。如果感到困惑,那麼就實現能適應你目前需求的最簡單的解決方案。
參考
stack overflow – time explained(堆棧溢出 – 時間解釋)
line_profiler(線性分析器)
memory_profiler(內存分析器)
objgraph(對象圖)
end
㈣ python的運算速度與cpu性能有關嗎
所有的編程語言最終都會被編譯成機器語言(0和1),然後由CPU運算執行,所以都是和起性能相關的
㈤ 為什麼Python適合科學計算
python做科學計算的特點:
1. 科學庫很全。
科學庫:numpy,scipy。作圖:matplotlib。並行:mpi4py。調試:pdb。
2. 效率高。
如果你能學好numpy(array特性,f2py),那麼你代碼執行效率不會比fortran,C差太多。但如果你用不好array,那樣寫出來的程序效率就只能呵呵了。所以入門後,請一定花足夠多的時間去了解numpy的array類。
3. 易於調試。
pdb是我見過最好的調試工具,沒有之一。直接在程序斷點處給你一個截面,這只有文本解釋語言才能辦到。毫不誇張的說,你用python開發程序只要fortran的1/10時間。
4. 其他。
它豐富而且統一,不像C++的庫那麼雜(好比linux的各種發行版),python學好numpy就可以做科學計算了。python的第三方庫很全,但是不雜。python基於類的語言特性讓它比起fortran等更加容易規模化開發。
python和老牌科學計算語言fortran相比,有著眾多的優勢,如果能用f2py接合兩者,那是極好的。
㈥ Python在科學計算中和C比較,性能差距大嗎
numpy/scipy底層都是純C的,性能不會比來matlab差。scikit-learn,
genism等都是建立在numpy/scipy之上。源python只是提供了一個膠水層。另外純python部分百也可以再用pypy
jit一下,性能相當可觀度
㈦ Python計算性能差的幾條原因
首先,Python對於底層操作得抽象使得vectorization(向量化)計算性能提升方法,不能一步實現。在純Python代碼中,我們不能除以元素均為float類型數據得列表,只能每次除以其中得一個元素,這就是不能向量化。當然,這個問題可以通過使用類似Numpy這樣得外部庫添加向量化操作來解決。
其次,Python對於底層操作得抽象使得基於使用L1/L2層cache來存儲數據用於下次運算的性能優化方法不能實現。因為python得garbage_collect機制,使得數據在內存中不得到最優排列,這產生了許多內存碎片,進而會引發以下這種情況,如果某次數據傳遞完全利用了bus得帶寬,但因為內存碎片造成了一次原算所需數據得缺失,所以本次運算會被丟棄,還要至少再重發一次數據,這就造成了數據發送時間得延長,也會造成性能下降。
然後是Python的動態類型和不被編譯。許多靜態語言,比如C,首先會對代碼進行編譯,而在編譯階段,編譯器會使用很多技巧來最優化所生成得中間代碼以及變數存儲在內存中得排列方式(比如結構體中得邊界對齊).而純Python代碼雖然也進行編譯,但不會像C語言編譯那樣進行存儲優化,而且更糟糕得是,其動態特徵使得對原生Python代碼得優化難以進行,因為在運行過程中python代碼不斷變化。但現在有一些方法來減輕這種問題對於性能得影響,首先想到得是Cextension,這個第三方模塊讓Python可以被編譯。
最後,是大家最熟悉得GIL(全局線程瑣),這使得純Python代碼在使用多線程技術時,不能利用當前最流行得多核CPU,極大得影響了其計算性能。不過,這個問題可以通過使用multiprocessing模塊來首先進行多進程操作,或使用Cextension等其他方法來克服這個問題。
㈧ 如何看待 python 的性能
在這個行業,相信大家不止一個人也不止一次的說過類似的話:"一個成熟的系統不會是由一門語言去包打天下的」。
還有就是python 在企業中可以作為主要使用語言,比如做web開發的公司,為什麼不呢,真正涉及到密集運算的部分很少,我們可以用很多替代方案解決,例如用c重寫那部分,用python粘合,或者是用其他語言重寫,再提供service介面等等,那個不是要命的問題,業務復雜度和需求變更才是要命的,這個小時討論,只有兩個小時編碼,1個小時測試,快速發布到線上所有環境讓用戶使用才是要命的問題,這個時候你跟我扯性能,那不是搞笑嗎?
還有一點是大部分國內的企業用非python是因為能用python真正解決問題的程序員相比之下少一些,這個來自於我們內部的數據統計,我們是做智能招聘的,通過大把(千萬級)的簡歷分析得到的結果。(不是那種學了一段時間python就妄下定義的人),市場的選擇而已,並不能說明問題。
是的,我自己所在的公司就是用python做為主要開發語言,也包括科學計算,海量分析相關的東西,沒見到他們工作時說python性能差,性能差的地方只佔他們工作的百分之幾,換個語言就繞過去了,當然你要說用python去寫游戲客戶端圖像處理那部分那就真的蛋疼了。每種語言都有他合適的應用場景。
㈨ python的性能
PPT的性能,這個你也找找這方面的消息吧,關於這個性能的一些介紹上多了解一下這個情況。