
18
|
第二章
有時候,懶惰不是什麼壞事,透過先進行效能分析,你能夠迅速地識別出需要被解決的
瓶頸,於是,你可以解決恰恰足夠的問題,就能夠達成需要的效能。如果避開效能分
析,直接投入最佳化,那麼,長期下來,你很可能會做更多的工作。因此,遵循效能分
析的結果來做事,才是明智的選擇。
有效率地進行效能分析
效能分析的首要目標就是測試代表性系統,識別出執行緩慢(或者使用太多 RAM,或
造成太多磁碟 I/O 與網路 I/O)的部分。效能分析通常會增加系統負擔(拖慢 10 倍到
100 倍是很平常的),而且你還想要讓你的程式碼盡可能像在真實世界裡那樣被使用。擷
取出測試案例並且隔離你需要測試的系統零件,最好的情況是,它已經被撰寫在自己的
一群模組裡。
在本章中,首先被引進的基本技術包括 IPython 的
%timeit
魔法,
time.time()
,以及計
時裝飾器(timing decorator)。你可以利用這些技術瞭解陳述式與函式的行為。
接著,我們將探討
cProfile
(參見第 31 頁的〈使用 cProfile 模組〉),說明如何使用這
項內建工具,來瞭解你的程式碼裡花最長時間運行的函式有哪些,這會讓你掌握問題的
高階觀點,好讓你將注意力集中在關鍵的函式上。
接下來,我們會檢視
line_profiler
(參見第 37 頁的〈使用 line_profiler 進行一行一行
的量測〉),這會在一行一行的基礎上,針對你所選擇的函式進行效能分析,結果將包括
每一行被呼叫的次數,以及花在每一行的時間百分比。這正是理解哪個部分執行得最緩 ...