【问题标题】:Why is the R match function so slow?为什么R匹配功能这么慢?
【发布时间】:2014-09-15 09:07:50
【问题描述】:

下面应该找到整数1的第一个实例的位置:

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 中需要一秒钟?它似乎在遍历整个数组...

有没有办法让它在找到匹配项后中止,而不是继续不必要地迭代?

【问题讨论】:

标签: r


【解决方案1】:

原因是R实际上并没有做线性搜索,而是建立了一个哈希表。如果您要搜索多个项目,这很有效,但如果您只搜索一个数字,则效果不佳。下面是函数的剖析:

如果您在数组中搜索单个整数,“更好”的实现可以使用线性搜索。我想这样会更快。

【讨论】:

  • 太棒了,谢谢你把它弄明白 :) 你知道在 R 中使用这种“高效”的方法吗?
  • 不,我不确定它是否在核心 R 中实现。但是很容易实现线性搜索。您需要在 C/C++ 中执行此操作,因为 R 循环很慢。这很容易使用 Rcpp 包,请参阅 Rcpp 库以获取示例。
  • 从我上面链接的问题中,@mnel 建议 which.max(array == 1) 作为潜在的节省时间
  • @thelatemail 是的,我想这几乎是 C 语言中的线性搜索。不过,它仍然会遍历整个数组。
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2015-07-14
  • 2016-10-08
  • 2022-07-29
  • 2022-01-09
  • 2017-02-11
  • 2023-04-04
相关资源
最近更新 更多