R語言本地緩存memoise
前言
緩存技術在計算機系統中運用地非常廣泛,特別是對於重複性計算,緩存能為我們節省大量的CPU時間,可能是99%。R語言以統計計算著名,但其中很多演算法包都是在進行大量重複的計算。
優化正再進行,改變已經開始。以Hadley Wickham為代表的R語言領軍人物,正在讓R快起來!你感覺到了嗎?!
目錄
- memoise介紹
- memoise安裝
- memoise的API介紹
- memoise使用
- memoise源代碼分析
1. memoise介紹
memoise是一個簡單的緩存包,主要用來減少重複計算,從而提升CPU性能。當你用相同的參數執行計算的時候,你會得到之前計算過的結果,而不是重算一遍。
緩存技術對於有並發訪問的應用來說,是性價比最高的性能提升方案。
註:memoise包是「Hadley Wickham」大神的作品!
memoise的發布頁:CRAN - Package memoise
2. memoise安裝
系統環境
- Win7 64bit
- R: 3.0.1 x86_64-w64-mingw32/x64 b4bit
memoise安裝
~Rnn> install.packages("memoise")ntrying URL http://mirror.bjtu.edu.cn/cran/bin/windows/contrib/3.0/memoise_0.1.zipnContent type application/zip length 10816 bytes (10 Kb)nopened URLndownloaded 10 Kbnnpackage 『memoise』 successfully unpacked and MD5 sums checkedn
memoise載入
> library(memoise)n
3. memoise的API介紹
非常簡單的API列表,只有2個函數。
- forget: 重置緩存函數
- memoize: 定義緩存函數
4. memoise使用
緩存測試
#定義緩存函數n> fun <- memoise(function(x) { Sys.sleep(1); runif(1) })nn#第一次執行fun函數n> system.time(print(fun()))n[1] 0.05983416n用戶 系統 流逝 n0 0 1nn#第二次執行fun函數 n> system.time(print(fun()))n[1] 0.05983416n用戶 系統 流逝 n0 0 0 nn#重置緩存函數n> forget(fun)n[1] TRUEnn#第三次執行fun函數 n> system.time(print(fun()))n[1] 0.6001663n用戶 系統 流逝 n0 0 1 n
- 1. 定義緩存函數memoise
- 2. 第一次執行fun函數, 等待sleep(1)
- 3. 第二次執行fun函數, 無等待,直接從緩存中返回結果
- 4. 重置緩存函數forget
- 5. 第三次執行fun函數, 由於fun被重置,返回2,等待sleep(1)
5. memoise源代碼分析
1). memoise函數
- 1. new_cache創建新的緩存空間,給f函數
- 2. 生成f函數的hash值,作為key
- 3. 返回緩存後的,f函數引入
memoise <- memoize <- function(f) {n cache <- new_cache()nn memo_f <- function(...) {n hash <- digest(list(...))nnif (cache$has_key(hash)) {n cache$get(hash)n } else {n res <- f(...)n cache$set(hash, res)n resn }n }n attr(memo_f, "memoised") <- TRUEnreturn(memo_f)n}n
2). forget函數
- 1. 檢查環境中,是否緩存了f函數
- 2. 如果有f函數的緩存,則清空f函數的緩存值
forget <- function(f) {nif (!is.function(f)) return(FALSE)nn env <- environment(f)nif (!exists("cache", env, inherits = FALSE)) return(FALSE)nn cache <- get("cache", env)n cache$reset()nnTRUEn}n
3). 私有函數:new_cache函數
- 1. 在new_cache函數里,定義cache對象,保存在env的環境中
- 2. 通過new_cache函數,構造list類型對象,包括reset,set,get,has_key,keys方法
- 3. 通過list對象,對cache對象進行訪問操作
new_cache <- function() {nn cache <- NULLn cache_reset <- function() {n cache <<- new.env(TRUE, emptyenv())n }nn cache_set <- function(key, value) {n assign(key, value, env = cache)n }nn cache_get <- function(key) {n get(key, env = cache, inherits = FALSE)n }nn cache_has_key <- function(key) {n exists(key, env = cache, inherits = FALSE)n }nn cache_reset()nlist(n reset = cache_reset, n set = cache_set, n get = cache_get,n has_key = cache_has_key,n keys = function() ls(cache)n )n
作者介紹:
張丹,R語言中文社區專欄特邀作者,《R的極客理想》系列圖書作者,民生銀行大數據中心數據分析師,前況客創始人兼CTO。
10年IT編程背景,精通R ,Java, Nodejs 編程,獲得10項SUN及IBM技術認證。豐富的互聯網應用開發架構經驗,金融大數據專家。個人博客 粉絲日誌, Alexa全球排名70k。
著有《R的極客理想-工具篇》、《R的極客理想-高級開發篇》,合著《數據實踐之美》,新書《R的極客理想-量化投資篇》(即將出版)。
《R的極客理想-工具篇》京東購買快速通道:《數據分析技術叢書:R的極客理想·工具篇》(張丹 )【摘要 書評 試讀】- 京東圖書
《R的極客理想-高級開發篇》京東購買快速通道:《R的極客理想 高級開發篇》(張丹)【摘要 書評 試讀】- 京東圖書
《數據實踐之美》京東購買快速通道:《數據實踐之美:31位大數據專家的方法、技術與思想》(天善智能)【摘要 書評 試讀】- 京東圖書
大家也可以加小編微信:tswenqu(備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流。玩R的夥伴都在裡面的,一起進來多交流官方公眾號:R語言中文社區 (ID:R_shequ) 歡迎關注,持續連載。推薦閱讀:
※細說Cache-L1/L2/L3/TLB
※Web靜態資源緩存及優化
※Linux查看cache信息
※HTTP 緩存機制一二三
※緩存級數是否有上限?