2014-07-24 108 views
5

下應該找到整數1的第一個實例的位置:爲什麼R匹配函數很慢?

array <- rep(1,10000000) 
system.time(match(1,array)) 

這將返回

user system elapsed 
    0.720 1.243 1.964 

如果我運行使用尺寸100的數組我得到這個相同的任務:

user system elapsed 
     0  0  0 

因爲所有它應該做的就是查看數組中的第一個值並返回一個匹配,所花費的時間應該是查找和比較的時間,而不管數組的大小。如果我用低級語言編寫它,則無論數組大小如何,它都將花費少量時鐘週期(微秒或更少?)的次序。爲什麼R需要一秒鐘?它似乎在遍歷整個數組...

有沒有一種方法讓它一旦找到匹配就中止,而不是繼續不必要地迭代?

+0

這個問題可能值得一讀:[更有效的策略,其中或匹配](http://stackoverflow.com/questions/16213029/more-efficient-strategy-for-which-or-match/16224331) – thelatemail

回答

9

原因是R實際上並沒有進行線性搜索,而是設置了一個哈希表。如果您正在搜索多個項目,這是有效的,但如果您只搜索一個數字,則效率不高。下面是函數的分析:

enter image description here

A「更好」的實現可以使用線性搜索,如果你正在尋找一個陣列一個整數。我想這會更快。

+0

很酷,謝謝你的清理:)你知道在R中使用這種「高效」的方法嗎? – arman

+0

不,我不確定它是否在覈心R中實現。但實現線性搜索很容易。你需要用C/C++來做,因爲R循環很慢。使用Rcpp包這非常簡單,請參閱Rcpp圖庫中的示例。 –

+0

從上面鏈接的問題來看,@ mnel建議'which.max(array == 1)'作爲潛在的時間保護程序 – thelatemail