【发布时间】:2011-12-10 05:00:15
【问题描述】:
我已经开始相信数据框与矩阵相比没有优势,除了符号方便。然而,当我在矩阵和数据帧上运行unique 时,我注意到了这种奇怪:它似乎在数据帧上运行得更快。
a = matrix(sample(2,10^6,replace = TRUE), ncol = 10)
b = as.data.frame(a)
system.time({
u1 = unique(a)
})
user system elapsed
1.840 0.000 1.846
system.time({
u2 = unique(b)
})
user system elapsed
0.380 0.000 0.379
随着行数的增加,时序结果的差异更大。所以,这个问题有两个部分。
为什么矩阵会变慢?转换为数据框,运行
unique,然后转换回来似乎更快。是否有任何理由不将
unique包裹在myUnique中,这会在第1 部分中进行转换?
注意 1. 鉴于矩阵是原子的,似乎unique 对于矩阵来说应该更快,而不是更慢。能够迭代固定大小的连续内存块通常应该比运行单独的链表块更快(我假设这就是数据帧的实现方式......)。
注 2。正如 data.table 的性能所证明的那样,在数据帧或矩阵上运行 unique 是一个相对糟糕的主意 - 请参阅 Matthew Dowle 和 cmets 的答案以了解相关时间。我已经将很多对象迁移到数据表中,而这种性能是这样做的另一个原因。因此,尽管应该很好地为用户提供采用数据表的服务,但出于教学/社区的原因,我将暂时保留关于 为什么 这在矩阵对象上需要更长时间的问题。下面的答案解决了时间在哪里,以及其他方法我们怎样才能获得更好的性能(即数据表)。 为什么的答案就在眼前 - 代码可以通过unique.data.frame 和unique.matrix 找到。 :) 对它在做什么以及为什么缺少这一切的英文解释。
【问题讨论】:
标签: performance r matrix dataframe data.table