将R语言代码转换为C语言代码

10

我正在研究将一个R脚本转换成C代码,以提高速度并使其能够打包为.exe文件。我的C语言经验很少。

我的问题是,用C语言会显著提高速度吗?速度瓶颈是需要在大量向量上应用的排序算法。我不确定R中的向量化功能是否会有所帮助或者减慢速度。此外,我已经了解到,在R中使用for循环效率低下。

如果我应该使用C语言来实现,有什么库可以帮助我模拟R中的一些数据处理函数,例如基本的矩阵操作?我应该从哪里开始学习?现在我甚至不知道如何将数据读入C语言(逗号分隔文本文件)。


1
这将是很多工作,尤其是从零开始学习C编程。你可以在比手动转换R代码更短的时间内在用户机器上安装R。 - hardmath
2
@Jack,我并不是在请求别人为我编写代码。我只是想问一下,在C脚本中使用的排序算法是否比在R脚本中使用的更高效。我认为这是一个合理的问题。我会重新表述一下,让它听起来不像是在请求别人替我编写代码。 - JoshDG
2
R中的向量排序使用了在C中实现的合理算法,因此提高速度的空间不大。也许你误诊了瓶颈所在,例如(对)大量小向量进行操作?但是,那么有可能通过重新构造问题来减少迭代次数。 - Martin Morgan
4
在重新设计之前,没有人提到过“个人资料、轮廓、档案”。 - Dirk Eddelbuettel
2
@DirkEddelbuettel:什么?为什么不花几天/几周时间学习并在新语言中重新实现算法呢?然后你可以测试它在你特定情况下是否真的更快,_而且_你还可以学习一门新语言!这不像有什么更好的事情要做... </sarcasm> - Joshua Ulrich
显示剩余5条评论
1个回答

12

我会尽力回答这个问题。

......但你并没有问到更相关的问题:R算法在R中能否变得更快?这里的答案通常是“可以”。它是否足够“快”?这是不可能回答的,除非尝试(并查看当前的R代码)。

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

答:是的!如果你为该算法编写“最好”的C代码,它很可能会更快。但这很可能也需要进行很多更多的工作。

问:使用C是否可以更快地排序大型向量?

答:是的。使用多线程,你可以显著提高速度。......但首先在R中调用sort(x, method='quick'),看看是否可以改善情况!对于随机数据,默认方法并不是很快。

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函数,然后从那里就可以访问所有R的功能! inline包和Rcpp包可以帮助简化过程。

第三种方法是将R嵌入到你的应用程序中。 Rinside可以帮助简化该过程。

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

答:查看fopenfscanf函数。...并使用它们编写一个数据导入函数。


目标平台必须为Windows(.exe已提及),可能是AMD64(32位已经过时,几乎没有人拥有Itanium)。一个好的BLAS将在AMD64中使用AVX,这可以大大加速代码(当然,另一种选择是循环)。即使在C语言中,Dirk上面的评论也适用:分析、分析、再分析。 - Matthew Lundberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接