【问题标题】:Discrepancy between R and Matlab speed [duplicate]R和Matlab速度之间的差异[重复]
【发布时间】:2012-10-19 23:40:00
【问题描述】:

可能重复:
Why are loops slow in R?

考虑以下任务。一个数据集有 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


【解决方案1】:

正如@joran 评论的那样,这是糟糕的 R 实践。无需重复对原始矩阵进行子集化,只需将子集放入列表中一次,然后使用 lapply 或类似名称遍历列表。

# make example data
set.seed(21)
userid <- 1:1e4
obs <- sample(150, length(userid), TRUE)
users <- rep(userid, obs)
Data <- cbind(users,matrix(rnorm(40*sum(obs)),sum(obs),40))

# reorder so Data isn't sorted by userid
Data <- Data[order(Data[,2]),]
# note that you have to call the data.frame method explicitly,
# the default method returns a vector
system.time(temp <- split.data.frame(Data, Data[,1])) ## Returns times in seconds
#    user  system elapsed 
#    2.84    0.08    2.92 

我的猜测是垃圾收集器正在减慢你的 R 代码,因为你不断地覆盖 temp 对象。

【讨论】:

  • 很高兴了解split.data.frame 应用于矩阵。非常好。
  • @JoshO'Brien:是的,这让我措手不及,所以我实际上不得不阅读文档。
  • 我实际上需要你的提示来阅读文档......我猜他们有 split.data.frame 作为解决方法,因为 split()drop= 参数已经被用于直接删除(或不)未使用的因子水平。
  • 感谢 Joshua 和 Josh!我不知道 split.data.frame 功能,它创造了奇迹。整个过程持续了 10 秒。极好的。我从中学到的是,我应该学习使用数据框函数。我在 MatLab 度过了我年轻的岁月,所以我仍然保持着旧习惯。我和我的共同研究人员都很敬畏。 ;)
  • @user1786009:不,不,不,这并不意味着你应该使用data.frame 方法!!! data.frames 比矩阵慢得多,我使用 split 的 data.frame 方法的唯一原因是因为默认方法只返回向量列表,而不是矩阵列表。请阅读?split了解。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2010-09-20
  • 2010-12-17
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多