itertools的效能

看到許多版友在問itertools的效能,讓我想跟大家分享一些關於程式效能的經驗。 一般來說,我們不會去優化所有的程式碼,因為優化有很大的代價:一般性與可讀性。 通常跑得快與寫的快,是要做取捨的。 這裡的例子很好想像,大家只要比較R的程式碼與Rcpp的程式碼就好了。 又由於程式的效能通常也符合80-20法則: 80%的時間是花在20%的程式碼 所以實務上,我不會從頭到尾都把程式用Rcpp來寫, 而是只抽出最花時間的那段程式碼,改成Rcpp。 以一個for loop來說: library(microbenchmark) library(itertools) ## Loading required »

itertools 簡介

最近在ptt R_Language版上看到許多跟迴圈有關的文章,所以一時興起想跟大家分享寫迴圈或apply等函數好用的套件:itertools library(itertools) ## Loading required package: iterators 講itertools之前,要先介紹iterator的概念:這是把迴圈的功能更精鍊出來的概念。 我們先看一個迴圈的範例: for(i in 1:3) { print(i) } ## [1] 1 ## [1] 2 »

機器學習系統需要的資料格式

之前我分享了對於一般線上系統與分析系統對於資料的不同需求,並且針對他們不同的需求,提出我個人認為,在工程資源有限時比較好的選擇。接下來我想拿機器學習系統的需求與線上系統、分析系統做比較。以廣告系統為例,一個常見的機器學習系統,就是對每一個bid request後面代表的事件預測使用者點擊廣告的機率。 就我所知,機器學習系統可以分成兩種作法。一般的作法會把整套系統分成兩塊:線上預測與線下學習。通常我們會先累計「可以學習」的資料,在線下透過各種方法讓機器學出一個模型。接下來再把模型放到線上系統,即時的對每一個事件做預測。另外一種作法,則是讓機器學習系統在收到事件後,做預測的同時,即時更新模型。兩者最主要的差異,就是前者是將預測與學習做分割, »

資料分析所採用的資料格式

數據分析已經是一個悠久的需求,也因此對於數據分析所需的需求,其實也有很多解法了。分析可以分成已知需求的分析與未知需求的分析。前者常常被分類到BI的範疇,而後者則是被歸類為分析的範疇。 若已知分析面向,我們可以在系統處理事物性需求時,做出即時的統計數據。舉例來說,在做RTB時,只要在每次收到win notice時將需要支付的金額更新到如redis的資料庫中,就可以了解最新的已花費金額。這樣的查詢,可以花費很少的力氣做到即時數據與即時的Dashboard。 但這種做法的缺點,是在規劃時,就限制了分析能查看的面向。若我們只累計金額,就只能查詢已花費的總金額。要查詢個別campaign花費的金額時,就只能回去爬log。如果我們儲存金額時,額外放入campaign的資訊,那無論是總金額或是各別campaign的金額, »

線上系統與分析系統對數據效能的不同需求

前面兩篇以系統的觀點分享數據系統儲存與傳輸資料的格式。今天我想分享我對數據分析所使用的格式的看法。 以系統的觀點,資料很自然的是一筆一筆做處理的。這是因為系統在收到一筆資料(Bid Request)之後,是要很快的做反應的(我要出標嘛?要的話出多少錢?)。因此,系統的觀點通常在追求我們對單一筆資料的處理時間。舉例來說,RTB系統都會即時監控平均每一個bid request的處理時間(主管希望系統平均的處理時間在0.05秒以下)。 然而在分析數據時,處理完一筆並沒有太多意義,而是要處理完全部的數據。因此,分析的觀點通常在追求我們處理整體資料的時間。舉例來說,一天有86400秒。如果用和線上系統相同的方式做處理, »