10

出于速度原因和将其打包为 .exe 的能力,我正在考虑将 R 脚本转换为 C 代码。我是 C 的新手。

我的问题是它在 C 中会明显更快吗?速率限制步骤是一种排序算法,必须多次应用于大向量。我不确定 R 中的矢量化功能是否会对此有所帮助或减慢速度。我还读到 for 循环在 R 中效率低下。

如果我应该在 C 中执行此操作,哪些库可以帮助我模仿 R 的一些数据处理功能,例如基本矩阵操作?我应该从哪里开始?现在我什至不知道如何将我的数据读入 C(逗号分隔的文本文件)。

4

1 回答 1

12

我会尽量回答这个问题。

...但是您不问的问题可能更相关:R 算法可以在 R 中更快吗?这里的答案通常是“是”。它可以“足够快”吗?好吧,如果不尝试(并查看当前的 R 代码),这是不可能回答的。

问:我的 R 算法在 C 中会更快吗?

答:是的!如果您为算法编写“最好的”C 代码,它很可能会更快。这样做很可能还需要做更多的工作。

问:在 C 中可以更快地对大向量进行排序吗?

答:是的。使用多线程,可以大大提高速度。...但是从调用sort(x, method='quick')R 开始,看看这是否会有所改善!对于随机数据,默认方法不是很快。

x <- runif(1e7)
system.time( sort(x) )                   # 2.50 secs
system.time( sort(x, method='quick') )   # 1.37 secs
#system.time( tommysort(x) )             # 0.51 secs (4 threads)

问:哪些库模仿了基本的 R 函数?

答:LAPACK/BLAS 在 R 中处理矩阵数学。如果您只需要这些,您可以找到比 R 中的普通库快得多的库(您也可以在 R 中使用其中的一些来提高性能!)。

关于 BLAS 的更多信息

另一种方法是从 R 到 C 进行 .Call,然后从那里您可以访问 R 的所有功能!包inlineRcpp包可以帮助使它更容易。

第三种方法是将 R 嵌入到您的应用程序中。Rinside可以帮助使这更容易。

问:如何将 CSV 数据读入 C?

- 答:看看fopenfscanf功能。...并使用它们编写数据导入功能。

于 2012-04-13T18:11:10.937 回答