運算效率提升:R中的向量化計算
R是函數式程式設計語言,其中向量化程式設計思維是其中的一個精髓,
向量化計算是一種特殊的平行計算的方式,相比於一般程式在同一時間只執行一個操作的方式,它可以在同一時間執行多次操作,通常是對不同的資料執行同樣的一個或一批指令,或者說把指令應用於一個陣列或者向量。
我們來看看在R中的向量化計算:
正如你看到的,向量化計算在R中的表現形式就是這麼簡單。下面我們來用一個簡單的例子做測試看看向量化計算對計算效率的提升效果。
計算一個陣列的平方和迴圈版
如果你剛接觸R或者從其他語言轉過來,可能你會寫如下的for迴圈代碼:
forFun # 性能測試## user system elapsed向量化版
它有一種更為簡便的寫法,直接採用base包中自帶的sum函數來求和。
verFun #性能測試## user system elapsed我們對以上兩種寫法做性能測試發現,當計算的向量達到百萬級別時,以上兩者效率相差竟超過30倍。
以上代碼是在win10系統上運行的,電腦配置的i5處理器以及8G記憶體,R是64位元3.2.5版本。
所以,當我們在編寫涉及到迴圈運算的代碼時儘量採用一些向量化的函數對其進行處理,
R中的向量化計算可以通過一些向量化的函數實現,下面介紹一下向量化計算的一些常用函數:
我把向量化的函數分為以下三類:
1.base自帶函數
向量操作
sum
mean
max
min
median
cumsum
cummax
cummin
cumprod
x ## [1] 15# 均值## [1] 3# 最大值## [1] 5# 最小值## [1] 1# 中位數## [1] 3# 累積和## [1] 1 3 6 10 15# 累積最大值## [1] 1 2 3 4 5# 累積最小值## [1] 1 1 1 1 1# 累積乘積## [1] 1 2 6 24 120邏輯操作
any
all
ifelse
x ## [1] TRUE# 判斷是否所有值為真## [1] FALSE# 條件為真輸出yes對應值,否則輸出no對應值## [1] 0 0 0 0 0 1 1 1 1 1矩陣操作
colSums
colMeans
rowSums
rowMeans
M ## [1] 6 15 24 33# 矩陣列求均值## [1] 2 5 8 11# 矩陣行求和## [1] 22 26 30# 矩陣行求均值## [1] 5.5 6.5 7.52.apply函數簇
apply
apply可以對矩陣或者陣列的同一緯度應用相同的函數並得到匯總後的結果。下面我們用apply來實現上述矩陣操作類似的功能:
M ## [1] 6 15 24 33# 矩陣列求均值## [1] 2 5 8 11# 矩陣行求和## [1] 22 26 30# 矩陣行求均值## [1] 2 5 8 11apply
中的函數除了採用系統自帶的函數外,還可以自行定義:
sapply
對每個元素應用相同的函數,有點像python裡面的map函數:
# 每個元素平方## [1] 1 4 9 16 25lapply
對list類型的資料做操作
x ## $aaggregate
資料匯總
## player x
3.plyr以及dplyr高級函數簇
小結
以上大多數向量化函數計算效率高的本質是其底層做了平行計算。我們在實際運用這些函數的時候,需要瞭解其適用場景,因地制宜,方能真正實現效率最大化。
End.
文章轉載自:資料採擷與R語言
中國統計網,是國內最早的大資料學習網站,歡迎關注!資料採擷與R語言+R語言程式設計藝術(京東套裝共2冊) ¥93.9 購買
多元統計分析及R語言建模(第4版) ¥32.5 購買
R語言資料採擷(21世紀統計學系列教材) ¥48.6 購買
是國內最早的大資料學習網站,歡迎關注!資料採擷與R語言+R語言程式設計藝術(京東套裝共2冊) ¥93.9 購買
多元統計分析及R語言建模(第4版) ¥32.5 購買
R語言資料採擷(21世紀統計學系列教材) ¥48.6 購買