天天看點

《Python高性能程式設計》——2.5 用UNIX的time指令進行簡單的計時

本節書摘來自異步社群《python高性能程式設計》一書中的第2章,第2.5節,作者[美] 戈雷利克 (micha gorelick),胡世傑,徐旭彬 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

現在讓我們脫離python使用類unix作業系統的标準系統功能。下面這條指令會記錄程式執行所耗費的的各方面時間,且不在意代碼的内部結構:

注意我們特地使用了/usr/bin/time而不是time,也就是說我們使用的是系統指令的time而不是那個更加簡單而沒用的shell内建版本的time。如果你用time --verbose,結果得到了一個錯誤,那麼你使用的可能就是shell内建的time而不是系統指令的time。

通過使用-p開關,我們得到了3個結果:

real記錄了整體的耗時。

user記錄了cpu花在任務上的時間,但不包括核心函數耗費的時間。

sys記錄了核心函數耗費的時間。

對user和sys相加就得到了cpu總共花費的時間。而這個時間和real的差則有可能是花費在等待io上,也可能是你的系統正在忙着運作其他任務是以影響了你的測量。

time并不是專為python腳本使用的。它還包括了啟動python解釋器的時間,如果你會啟動很多新程序(而不是一個長期運作的單一程序),這個時間可能會很長。如果你會經常跑一些臨時腳本,它們的啟動時間占了整體運作時間的很大一部分,那麼time更适合測量這種情況。

我們可以打開--verbose開關來獲得更多輸出資訊:

這裡最有用的名額可能是major (requiring i/o) page faults,因為它訓示了作業系統是否由于ram中的資料不存在而需要從磁盤上讀取頁面。而這會帶來速度上的懲罰。

我們的例子中對于代碼和資料的需求較少,是以不會發生記憶體缺頁錯誤。如果你有一個記憶體密集型程序,或多個需要配置設定和使用大量ram的程序,你就會發現這個指令可以告訴你哪個程序會因為一部分ram被交換到磁盤上這一額外的作業系統級别的磁盤通路而導緻速度的下降。