什麼都用於分析和性能測試Python代碼的最佳實踐和工具? 任何快速勝出或建議。
CProfile接縫流行和一些偉大的筆記/答案下面,都是非常好的答案/教程。投票,我會在一兩天內挑選最好的。謝謝@senderle和@ campos.ddc
一旦發現問題區域,是否有任何成語和/或提示轉換代碼使其更快?
什麼都用於分析和性能測試Python代碼的最佳實踐和工具? 任何快速勝出或建議。
CProfile接縫流行和一些偉大的筆記/答案下面,都是非常好的答案/教程。投票,我會在一兩天內挑選最好的。謝謝@senderle和@ campos.ddc
一旦發現問題區域,是否有任何成語和/或提示轉換代碼使其更快?
cProfile
是經典的剖析工具。使用它的基本方法是like so:
python -m cProfile myscript.py
在這裏,我把它叫做一個參考實現,我寫了mersenne twister的測試程序。
[email protected] $ python -m cProfile mersenne.twister.py
True
True
1000000
1003236 function calls in 2.163 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 2.163 2.163 <string>:1(<module>)
1 0.001 0.001 2.162 2.162 mersenne.twister.py:1(<module>)
3 0.001 0.000 0.001 0.000 mersenne.twister.py:10(init_gen)
1000014 1.039 0.000 1.821 0.000 mersenne.twister.py:19(extract_number)
1 0.000 0.000 0.000 0.000 mersenne.twister.py:3(Twister)
1603 0.766 0.000 0.782 0.000 mersenne.twister.py:33(generate_numbers)
1 0.000 0.000 0.000 0.000 mersenne.twister.py:4(__init__)
1 0.317 0.317 2.161 2.161 mersenne.twister.py:42(_test)
1 0.001 0.001 2.163 2.163 {execfile}
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1608 0.038 0.000 0.038 0.000 {range}
ncalls
是函數被調用的次數。 tottime
是在一個函數中花費的總時間,不包括在子函數調用中花費的時間。 percall
是tottime/ncalls
。 cumtime
是花在函數上的時間,包括在子函數調用中花費的時間。其餘數據如下:filename:lineno(func_name)
。
在大多數情況下,首先看ncalls
和tottime
。在上面的數據中,你可以看到這個程序花費的大部分時間發生在extract_number
。此外,我們可以看到extract_number
被稱爲很多(1000014)次。所以我可以做的任何事情來加速extract_number
將顯着加快此測試代碼的執行。如果它獲得微秒,那麼增益將乘以1000014,從而產生完整的第二增益。
然後我應該在generate_numbers
上工作。在這方面的收益不會那麼重要,但它們可能仍然很重要,並且由於該功能再耗時0.7秒,所以還有一些好處。
這應該給你的一般想法。但是,請注意,例如,在遞歸情況下,tottime
數字有時可能具有欺騙性。
感謝senderle,任何提示如何解釋結果並採取行動? – 2012-02-23 01:03:28
@MattAlcock你可能想看看關於分析的python官方文檔:http://docs.python.org/library/profile.html – 2012-02-23 01:15:18
偉大的聯繫,謝謝里克。我會檢查一下。除分析以外的其他任何成語? – 2012-02-23 01:19:37
* [這是一個快速勝利。](http://stackoverflow.com/questions/4295799/how-to-improve-performance-of-this-code/4299378#4299378)* – 2012-02-23 13:28:31