看起來像Wes可能在data.table
中發現了一個已知問題,此時唯一字符串的數量(級別)很大:10,000。
是否Rprof()
顯示通話中花費的大部分時間sortedmatch(levels(i[[lc]]), levels(x[[rc]])
?這不是真正的連接本身(算法),而是一個初步步驟。
最近的努力已經進入允許密鑰中的字符列,這應該通過更密切地與R自己的全局字符串哈希表進行集成來解決該問題。一些基準測試結果已經由test.data.table()
報告,但該代碼還沒有連接起來,以將級別替換爲級別匹配。
對於常規整數列,大熊貓的合併速度是否快於data.table
?這應該是隔離算法本身與因素問題的一種方式。
另外,data.table
有時間系列合併記。兩個方面:i)多列訂購鍵如(id,datetime)ii)快速流行加入(roll=TRUE
)又名a.a.最後一次觀察結轉。
我需要一些時間來確認,因爲這是我看到的第一個與data.table
的比較。從data.table v1.8.0
UPDATE釋放除去和匹配I水平至x水平類型的列時與chmatch() 取代2012年7月
- 內部功能sortedmatch() '因子'。這個 的預備步驟在因子列的水平數量很大(例如> 10,000)時導致(已知的)顯着減速。 加入四個這樣的列的測試加劇,如Wes McKinney (Python包Pandas的作者)所示。例如,匹配100萬個字符串,其中 ,其中600,000個是獨特的,現在從16秒減少到0.5秒。
還在於釋放是:現在
截止到2013年9月,data.table在CRAN上是v1.8.10,我們正在研究v1.9.0。 NEWS現場更新。
但正如我最初寫的,上面:
data.table
有時間序列考慮合併。兩個方面即:i) 多列訂購密鑰如(id,datetime)ii)快速流行 加入(roll=TRUE
)又名a.a.最後的觀察結轉。
因此,兩個字符列的Pandas equi連接可能仍然比data.table更快。因爲它聽起來像是將兩列合併在一起。 data.table不會散列密鑰,因爲它具有流行的有序連接。 data.table中的「key」實際上就是排序順序(類似於SQL中的聚簇索引;即數據在RAM中的排序方式)。例如,列表中添加了輔助鍵。
總而言之,由於已知問題已得到解決,現在使用超過10,000個獨特字符串的特定雙字符列測試強調的顯着速度差異現在應該不會那麼糟糕。
我的假設:因爲data.table是基於data.frame和data.frames是緩慢的。我認爲大部分熊貓合併代碼都在Cython中。 –
@JoshuaUlrich:IIRC'data.table'只是繼承自'data.frame',但它依賴於C代碼。 – digEmAll
@digEmAll:即使您在C中操作它們,data.frames也很慢,但我從來沒有看過data.table源代碼。 –