使用cProfile針對回測進行效能分析,和結合說下提速思路

張國平發表於2019-10-16

昨天再研究lru_cache快取讀取回測優化時候,使用了效能分析工具cProfile,發現還是非常強力的分析工具,這裡做個簡單介紹。並結合說下一些策略提速思路。
關於cProfile使用這個文章寫的很詳細, https://www.cnblogs.com/btchenguang/archive/2012/02/03/2337112.html 。 這裡我簡單接受下。

安裝

不用安裝,python一般自帶都有的,

使用

使用方法有幾個,我是直接輸出。就是把回測程式碼放在一個方法裡面,比如runBackTesting()裡面。然後再main方法按照下面程式碼跑,這裡是按照累計時間排序的。提示,最好註釋掉Matplot影像輸出,因為互動的時間也是統計的。

if __name__ == '__main__':
    cProfile.run("runBackTesting()", sort="cumulative")

效能分析結果

如下圖所示

  • 第一行 是總共呼叫function次數,和總執行時間次數
  • 下面列的說明
    • ncalls:表示函式呼叫的次數;
    • tottime:表示指定函式的總的執行時間,除掉函式中呼叫子函式的執行時間;
    • percall:(第一個percall)等於 tottime/ncalls;
    • cumtime:表示該函式及其所有子函式的呼叫執行的時間,即函式開始呼叫到返回的時間;
    • percall:(第二個percall)即函式執行一次的平均時間,等於 cumtime/ncalls;
    • filename:lineno(function):每個函式呼叫的具體資訊;前面是檔名,第幾行,後面是方法名,有些方法比如max,min這些就沒有檔名了。

一些分析

一般關注兩個ncalls,和cumtime。這裡結合說下一些提速思路

  • 通常ncalls如果只有一兩次,但是cumtime很長;這些通常是硬碟IO讀取一類,只能儘量減少這些次數。
  • ncalls次數很多,而且cumtime不低的,是優化重點,可以看到主要是bar回溯。如果vnpy自帶改進思路不是很多。如果是自己的onBar方法,儘量減少裡面運算,可以放在條件判斷下的,先放進去。
    比如self.pos == 0, self.pos <> 0: 這樣。
  • 在不會缺少資料的前提下,儘量減少ArrayManager中的長度,比如ArrayManager(50),比預設100少一半。
  • 使用快取或者固化資料,我自己定義了一個方法atrlog,發現用時很多,檢查發現實在每次呼叫時候要用三次np.log去計算high, low, close的對數值;這裡我索性一次過把所有歷史資料在讀取時候就把歷史資料對數化放到cache裡面。減少了耗時。

當然還有很多,只是一些我的思路,其他優化可以見專業文章。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2660175/,如需轉載,請註明出處,否則將追究法律責任。

相關文章