【詐屍譯文】R 3.4.0的性能提升
01-27
作者 David Smith
譯者 錢亦欣
R 3.3.3(代號「另一條輕舟」)在3月6號發布了。這是R 3.3系列的「包裝發布版」,它只包含了少量的bug修復和提升,並不加入主要的新特性。而這些重要的變化則會在隨後的R 3.4.0中體現。R 3.4.0的預告內容可能還有待編輯完善,可一些基於不同方式實現的性能優化已經提前公布了。具體內容如下:
一個「just-in-time」JIT編譯器,自2011年以來,R的核心包一直基於位元組編譯。R包的作者們也可以選擇利用位元組編譯他們的R代碼。但對於普通用戶而言,利用位元組編譯給他們的代碼帶來的增益技巧性太強。但在3.4.0版中,你的R腳本和自定義函數中的循環將會在調用這些內容時採用位元組編譯(「just-in-time」)。如此以來,你幾乎不用做任何調整就能享受R代碼性能的提升!
線代運算性能提升。R使用BLAS庫來實現很多線代領域的高性能運算,而新版R將會使用一些更快的方法來實現一些特定操作(比如矩陣乘向量)。同時,之前用以檢查矩陣中缺失值(BLAS一般無法解決)的步驟也會被提速。這會使得R的所有發行版的性能提升,比如綁定了多線程BLAS庫的Microsoft R
R包中已編譯代碼的提升。許多包都含有用C或C++(甚至Fortran,它現在依舊是科學計算的利器)寫的代碼以供R函數調用。R 3.4.0將會包含一個新系統,使得R包的開發真可以選擇將這些代碼與其他包共享或是繼續保持獨立。這一新註冊系統會提升調用編譯函數過程的速度,特別實在Windows系統下。每次調用大概能節省微秒級別的時間,當這些函數被調用上千乃至上百萬次時,節省的時間成本就很客觀了。這已系統也確保了對已經編譯好的函數的調用有著正確的結構——一個可信的檢查已經對CRAN上很多包進行了潛在bug檢測。
在循環中可以更快地拓展向量。在循環的每次迭代中拓展向量長度依舊不是推薦的做法(在循環前就給向量分配足夠的長度才是康庄大道),但現在這類代碼實現起來會比以前快一點,因為R偶爾會在需要的基礎上再多佔用一點點內存。
其他函數的性能提升。向量排序現在更快了(感謝默認使用的radix-sort演算法)。包好缺失值的表格的運算也會提速。「str」函數在遇到長字元串時也不再像之前呢么慢吞吞的了,「sapply」函數對於包含維度名的多維數組也會有更好的表現。
其他無關性能的優化包括:
Windows系統下更新了Tcl/Tk繪圖系統的版本
對表格中缺失值的處理更一致
一些統計函數對極端值的處理更精確
對一些程序錯誤能進行更好的檢測和警告,比如比較向量和0維數組
目前關於3.4.0的發布日期仍舊不明確,但更具小道消息,新版本很可能在4月中旬面世。無論如何,它會給R用戶(尤其時追求性能的用戶)帶來顯著的體驗提升。
原文網址
譯者註:最近真是忙的要吐血,今天抽空詐個屍,證明我還活著。。。
推薦閱讀:
※[譯] 解密 Airbnb 的數據科學部門如何構建知識倉庫
※僅用四行代碼就可以挖掘你的QQ聊天記錄
※數據分析利器之dplyr、ggplot2包
※Learn R | 字元串處理之stringr包(上)
※【譯文】用R語言做網頁爬蟲和文本分析-Part2