【发布时间】:2012-10-19 23:40:00
【问题描述】:
考虑以下任务。一个数据集有 20,000 个“用户”的 40 个变量。每个用户有 1 到 150 个观察值。所有用户都堆叠在一个称为数据的矩阵中。第一列是用户的 id,用于标识用户。所有 id 都存储在一个名为 userid 的 20,000 X 1 矩阵中。
考虑以下 R 代码
useridl = length(userid)
itime=proc.time()[3]
for (i in 1:useridl) {
temp =data[data[,1]==userid[i],]
}
etime=proc.time()[3]
etime-itime
这段代码只经过 20,000 个用户,每次都创建临时矩阵。使用属于 userid[i] 的观察子集。在 MacPro 中大约需要 6 分钟。
在 MatLab 中,同样的任务
tic
for i=1:useridl
temp=data(data(:,1)==userid(i),:);
end
toc
需要 1 分钟。
为什么 R 这么慢?这是标准任务,我在这两种情况下都使用矩阵。有什么想法吗?
【问题讨论】:
-
在 R 中几乎可以肯定(很多)更好的方法可以做到这一点。创建一个small toy example(例如,有 5 个变量、2 个用户和 3 个观察值),这里有人会告诉你一个其中。
-
为了补充 Josh 的观点,尽量不要使用
data,因为这是 R 中的一个定义词。另外,我相信将你的函数包装在system.time()中比添加和减去两个 @ 更准确987654327@ 来电。 -
当人们比较具有“相同”代码的语言之间的速度时,他们通常最终比较的是他们在每种语言中的编程技能。 (即,如果我开始将 R 与 Matlab 进行比较,我可能会对 Matlab 的速度感到震惊。)
-
@user1786009 如果你用不同的方式表达你的问题,你可能会在 R 人群中激怒更少的羽毛。你所说的方式表明 R 不符合“标准任务”,这意味着你认为你完成它的方式是在 R 中做它的正确方式。而不是“为什么这个任务更慢在 R 中比在 MATLAB 中?”,提出这个问题的一种更中性的方式可能是,“为什么这个结构在 R 中比 Matlab 慢?”。后者可能会深入了解两种语言的比较工作,而前者可能会尝试证明 R 并不逊色。
标签: performance r matlab