中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用fastcache

發布時間:2021-12-29 17:50:55 來源:億速云 閱讀:197 作者:小新 欄目:編程語言

小編給大家分享一下如何使用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)

使用clru_cache, 更新trader/app/ctaStrategy/ctaBacktesting.py, 讓回測歷史數據緩存到內存,不用反復讀取

  • 通常只在靜態方法使用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”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德阳市| 固阳县| 白玉县| 同江市| 穆棱市| 城步| 浪卡子县| 垣曲县| 无棣县| 秭归县| 额济纳旗| 长顺县| 剑川县| 团风县| 建昌县| 观塘区| 平顶山市| 和田市| 曲阜市| 赞皇县| 山阴县| 樟树市| 皮山县| 永宁县| 慈利县| 黔西| 桂平市| 玛纳斯县| 皋兰县| 平罗县| 泸西县| 金阳县| 永泰县| 台东县| 红原县| 含山县| 屯留县| 株洲市| 洛南县| 新安县| 称多县|