VIM 的作者Bram Moolenaar在一篇叫高效文本編輯器的7個習慣的ppt中有這么一段話。
Three basic steps
1. Detect inefficiency
2. Find a quicker way
3. Make it a habit
即
1.檢測哪里效率低下
2.找到一種更快的方法
3.養成習慣
這3個步驟可謂是大道至簡。放之四海而皆准。
不止適用於vim,一樣適用於python以及其他語言,也適用於現實生活。
這簡單的道理很多人都懂,但是卻有很多人沒有貫徹。
一遇到性能問題就胡亂猜測,毫無目的,無針對性。
性能問題也符合20/80規則。即20%的代碼引起了80%的性能損耗。
可能有很多地方可以修修補補來優化,但是卻是無關痛癢的性能提升,效果不明顯,還經常把代碼搞的一團糟。
感覺是不可靠的,要用數據說話。
通過profile可以快速定位到熱點。針對熱點來進行優化,往往能收到奇效。
python自帶了profile模塊。還自帶用c語言寫的cProfile。
使用很簡單,在命令行中
python -m cProfile xxx.py。
拿《
飄逸的python - 打印螺旋矩陣》中的代碼來分析。

其中ncalls是調用次數。
那么tottime 跟cumtime有什么區別呢。
cumtime即cumulative time,累積時間,包含子函數。這里說的子函數,就是在函數中調用其它的函數。
而tottime不包含子函數的時間。
從profile出來的結果可以看出,display_spiral()函數調用了2次,消耗了0.02秒,其它的加起來也就0.001秒,可見print輸出很耗性能。
幾種使用方法:
1.命令行中python -m cProfile xxx.py。
此方法方法只能對整個文件進行profile.
2.cProfile.run('statement')
run方法的參數是python語句,比如可以是一條函數調用的語句。
import cProfile
cProfile
.
run
('display_spiral(4,4)
'
)
3.enable/disable
此方法可以對某一部分代碼進行profle.
import cProfile
p = cProfile.Profile()
p.enable()#開始采集
display_spiral(4,4)
display_spiral(5,4)
p.disable()#結束采集
p.print_stats(sort='tottime')#打印結果