您好,登錄后才能下訂單哦!
小編給大家分享一下如何使用fastcache,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
VnTrader 2.0版本有不少提速措施,其中lru_cache是提高回測速度一個利器,讓我用1.92為主的我很是羨慕。看說這個是python 3.5.2提供的功能,也就沒多想。
最近才發現其實有第三方在也支持python 2.7的版本,比如 functools32。還有一個用 C 語言實現的,更快的,同時兼容 Python2 和 Python3 的第三方模塊 fastcache 能夠實現同樣的功能,這里就用fastcache。
很簡單,pip直接安裝就可以。
pip install fastcache --upgrade
import fastcache fastcache.test()
不用cache時候,運行時間 0.7994769 秒
from fastcache import clru_cache def fib(n): if n < 2: return n return fib(n - 2) + fib(n - 1) import time dt0 = time.clock() for i in range(30): fib(i) spreadtime = (time.clock() - dt0) print ("運行時間 %s 秒" %spreadtime)
使用后,運行時間 0.000185200000004 秒
@clru_cache(maxsize=999) def fib_cache(n): if n < 2: return n return fib_cache(n - 2) + fib_cache(n - 1) import time dt1 = time.clock() for i in range(30): fib_cache(i) spreadtime = (time.clock() - dt1) print ("運行時間 %s 秒" %spreadtime)
通常只在靜態方法使用lru_cache,這樣才具有意義, 雖然在類方法中也可以使用,但是這樣一個是有不同實例一般無法復用,而且會使得過期實例無法垃圾回收。這里新建一個靜態方法load_data,負責讀取數據庫數據。
@clru_cache(maxsize=9999) def load_data(dbName, symbol, dataStartDate, strategyStartDate, dataEndDate, dataClass): dbClient = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort']) collection = dbClient[dbName][symbol] # 載入初始化需要用的數據 flt = {'datetime': {'$gte': dataStartDate, '$lt': strategyStartDate}} initCursor = collection.find(flt).sort('datetime') initData = [] # 清空initData列表 for d in initCursor: data = dataClass() data.__dict__ = d initData.append(data) # 載入回測數據 if not dataEndDate: flt = {'datetime': {'$gte': strategyStartDate}} # 數據過濾條件 else: flt = {'datetime': {'$gte': strategyStartDate, '$lte': dataEndDate}} BackData = [] dbCursor = collection.find(flt).sort('datetime') for dc in dbCursor: data = dataClass() data.__dict__ = dc BackData.append(data) count = len(initData) + len(BackData) return initData, BackData, count
修改已有方法BacktestingEngine.loadHistoryData; 改為使用剛剛創建靜態方法
def loadHistoryData(self): """載入歷史數據""" self.output(u'開始載入數據') # 首先根據回測模式,確認要使用的數據類 # load_data(dbName, symbol, dataStartDate, strategyStartDate, dataEndDate, dataClass) if self.mode == self.BAR_MODE: dataClass = VtBarData func = self.newBar self.initData,self.BackTestData, count = load_data(self.dbName,self.symbol, self.dataStartDate, self.strategyStartDate, self.dataEndDate, dataClass) else: dataClass = VtTickData func = self.newTick self.initData, self.BackTestData, count = load_data(self.dbName, self.symbol, self.dataStartDate, self.strategyStartDate, self.dataEndDate, dataClass) # 載入初始化需要用的數據 if self.hdsClient: initCursor = self.hdsClient.loadHistoryData(self.dbName, self.symbol, self.dataStartDate, self.strategyStartDate) # 將數據從查詢指針中讀取出,并生成列表 self.initData = [] # 清空initData列表 for d in initCursor: data = dataClass() data.__dict__ = d self.initData.append(data) # 載入回測數據 self.dbCursor = self.hdsClient.loadHistoryData(self.dbName, self.symbol, self.strategyStartDate, self.dataEndDate) for dc in self.dbCursor: data = dataClass() data.__dict__ = dc self.BackTestData.append(data) self.output(u'載入完成,數據量:%s' % count)
修改 BacktestingEngine.runBacktesting; 改為使用換成的BackTestData 隊列,而不是數據庫指針。
def runBacktesting(self): """運行回測""" # 載入歷史數據 self.loadHistoryData() # 首先根據回測模式,確認要使用的數據類 if self.mode == self.BAR_MODE: dataClass = VtBarData func = self.newBar else: dataClass = VtTickData func = self.newTick self.output(u'開始回測') self.strategy.onInit() self.strategy.inited = True self.output(u'策略初始化完成') self.strategy.trading = True self.strategy.onStart() self.output(u'策略啟動完成') self.output(u'開始回放數據') for d in self.BackTestData: func(d) self.output(u'數據回放結束')
沒有使用之前,優化約為100組參數約為運行時間 323.0888239 秒,使用cache優化后運行時間 190.762839 秒
以上是“如何使用fastcache”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。