R語言程式設計藝術(5)R語言程式設計高階

2022-08-19 04:45:08 字數 2280 閱讀 7208

本文對應《r語言程式設計藝術》

第14章:效能提公升:速度和記憶體;

第15章:r與其他語言的介面;

第16章:r語言平行計算

效能提公升:速度和記憶體

要使r**執行速度更快,有以下建議:

通過向量化的方式優化、使用位元組碼編譯等;

將**中最消耗cpu的核心部分用編譯型語言編寫,如c或c++;

將**用某種並行的方式編寫。

消除顯示迴圈:

採用向量化提公升速度,因為採用顯示迴圈涉及多次函式呼叫和迭代,耗費時間,而向量化函式內部是用編譯型語言實現,因此會提公升速度。

常用的加速**的向量化函式:ifelse() /which() /where() /any() /all() /cumsum() /cumprod()等函式;用於矩陣的rowsums() /colsums()等函式;用於窮舉所有組合問題的combn() /outer() /lower.tri() /upper.tri() /expand.grid()等函式。

利用rprof()來尋找**的瓶頸:

首先呼叫rprof()來開啟監視器,然後執行**,再呼叫帶null引數的rprof()來結束監視。最後,呼叫summaryrprof()來檢視結果。

記憶體管理:

資料分塊:read.table()函式的skip引數設定,可以分塊讀取資料。

r軟體包的記憶體管理:rmysql,提供r與mysql的介面,將選擇資料的操作放在資料庫端;biglm包,可以在非常大的資料集上進行回歸和廣義線性模型的分析;ff包,通過將資料存放在硬碟上來迴避記憶體的限制;bigmemory包,功能類似,但它不僅可以將資料儲存在硬碟上,還可以將資料儲存在機器的主記憶體中,這對於多核的機器而言是乙個理想的選擇。

r與其他語言的介面

能被r呼叫的c/c++函式:

一般而言,這樣做的目的是提公升程式的效能;另乙個原因是使用特殊的i/o操作(例如r使用的tcp協議速度不如c/c++使用的udp協議)。

介面可以通過.c()或.call()實現。.call()提供了更全面的功能,但使用它需要對r的內部結構有所了解。

注意:c語言中,二維陣列是按行進行儲存的,而在r中則是按列儲存;c語言下標是從0開始,而在r中是從1開始。

從python呼叫r:

python缺少內建的統計和資料處理功能,可以通過r來彌補。

rpy是乙個python模組,允許在python中使用r。如果希望有額外的效能提公升,則可以考慮與numpy共同使用。

語法:r中的物件(函式)名冠上r.字首。

注意:python的語法中沒有波浪號,因此在指定模型表示式時需要使用字串;

需要乙個資料框來包含資料;

如果r的函式名中帶有英文句點,那麼需要在python中改為下劃線。

>>>r.library(『lattice』)

>>>r.assign(『a』, a)

>>>r.assign(『b』, b)

>>> r(『g <-expand.grid(a, b)』)

>>> r(『g$var3 <- g$var1^2 + g$var1 *g$var2』)

>>> r(『wireframe(var3 ~ var1 +var2, g)』)

>>> r(『plot(wireframe(var3 ~ var1 + var2, g))』)

r語言平行計算

snow包簡介:主要過程:

載入**

載入snow包

建立snow集群

建立相關的鄰接矩陣

在建立的集群上針對鄰接矩陣執行**

openmp包:

利用r呼叫並行化的c

常用指令:

#pragma omp barrier

迭代型演算法中常用,執行緒將在屏障處進行等待,直到每次迭代的結束

#pragma omp critical

// place one or more statements here

緊接著這一指令的**塊稱為乙個「關鍵區域」(critical section),意思是在這個區域中同時只允許乙個執行緒執行這段**

#pragma omp single

// place one or more statements here

緊接著這一指令的**塊將只被乙個執行緒執行

簡單並行(embarrassingly parallel):

指那些執行緒與執行緒之間不需要進行互動的並行方式,它們往往只需要將原始的程式稍加修改即可實現並行。這樣,不僅編寫簡單,而且有著極地的通訊開銷。

靜態和動態任務分配:

總體來說,動態任務分配因為有可能產生嚴重的快取開銷,因此實際上效能不如靜態分配。

R語言程式設計藝術 11 14 15

11.字串操作 a c equator north pole south pole grep pole a 在字串a中搜尋pole nchar a 返回字串a的長度 r語言中的字串末尾沒有空字元null 對於非字元形式就要用到hadley wickham寫的stringr包 paste north ...

R語言程式設計

本文章主要自己的學習過程,部落格作為筆記 r中的包儲存在計算機上名為library的目錄下 使用函式.libpaths 可以檢視該資料夾在計算機中的具體路徑 函式library 顯示已安裝的包的列表 函式search 顯示已載入的包的列表 install.packages 包名 移除包 載入過多的包...

《R語言程式設計藝術》 2 10 測試向量相等

假設我們要測試兩個向量是否相等,使用 的樸素方法將不可行 事實上,是乙個向量化的函式。語句x y是將函式 應用到x和y的每一組元素上,得到乙個布林值的向量。那麼我們可以做什麼呢?一種選擇是結合 的向量化本質,應用函式all 對 的結果應用all 函式會詢問其所有元素是否全為真,它與詢問x與y是否完全...