performance - 如何最大化原生 R 脚本的性能(将运行数千次)?

标签 performance r jit processing-efficiency

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .




9年前关闭。




我正在尝试对相同的模拟数据集上的几个统计测试进行强力的头对头比较。我将生成数千个“控制”和数千个“实验”种群,并在每组上运行相同的测试。调用测试的包装器将被调用数千次。

我的问题是:

  • 下面的计划是一个好的计划吗?
  • 你能想出任何方法来提高速度吗(不重写 native R 函数,尽管我可以复制它们的内部代码的子集并只运行它而不是整个函数)?

  • 计划

    我已经有了模拟种群,并将使用适当的应用函数将控制和相应的实验观察传递给包装器。

    除了控制和实验观察之外,包装器将没有任何参数(我们称它们为 xxyy )。其他所有内容都将在包装器中进行硬编码,以尽可能避免流控制逻辑的开销和在环境之间复制数据。

    每个被调用的函数都将在一个单独的行上,以一致的格式,按照依赖的顺序排列(例如,cox.zph 依赖于已经存在的 coxph 对象,所以 coxph() 将是在 cox.zph() 之前调用)。这些函数将被包裹在 try() 中。如果一个函数失败,输出和依赖它的函数首先测试它返回的对象是否有try-error作为它的第一类,如果是的话,某种占位符值。

    被调用函数的 block 后面会跟一个很长的 c()语句,每个项目从单独的行上的相应拟合对象中提取。这里也是,如果源对象是 try-error或占位符,输入 NA在那个输出槽中。

    这样,如果某些函数失败,整个运行不会中止,并且每个模拟的输出是相同长度的数字向量,适合捕获到矩阵。

    根据给定模拟集的目标,我可以根据需要注释掉或插入额外的测试和结果。

    一些更具体的后续问题
  • 如果我已经在使用 compilePKGS(T)enableJIT(3) (来自内置的compiler 库),手动运行compile() 有什么进一步的收获吗?或 cmpfun()在我的包装函数和它调用的解释函数上?
  • 有人对选择最好的有任何指导吗enableJIT()值(value),或者如果我不关心启动时间,是“越多越好”?
  • 如果每个模拟都是一个新的随机变量,我从内存中没有任何收获,对吧?
  • 对于长时间运行的任务,我喜欢让内部函数检查是否存在给定名称的文件,如果存在,则将其源到其环境中。这允许我重新获得对 session 的控制以解决问题,运行 browser() ,保存内部对象等,而不必中止整个运行。但是,我想 ping 通常会开始累加的文件系统。对于将 bool 值(即是否提供调试脚本)传递给正在运行的 R 进程(在 Linux 下)的最有效方式是否存在共识?

  • 谢谢。

    最佳答案

    这可能只会解决您的部分问题。我也很幸运通过避免应用函数来加快进程。 apply 不是矢量化的,实际上需要相当多的时间。我看到了使用嵌套 ifelse() 语句的好处。

    你试过 Rprof() 吗?在我的案例中,它有助于识别我的代码中的慢速元素。本身不是解决方案,而是有用的诊断。

    关于performance - 如何最大化原生 R 脚本的性能(将运行数千次)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16550093/

    相关文章:

    performance - 压缩使响应时间变慢

    r - 从字符向量中提取和计算常用词对

    r - 向 quantmod/xts 添加因子列

    Android Instrumentation 测试关注 : debug vs. Release模式

    Flutter AOT 与 JIT

    mysql - 哪个更快?插入还是更新?

    c++ - 在 C++ 中将 float 截断为最接近的 2 的幂 - 性能

    r - 如何将非优化参数传递给 GA 包中的适应度函数

    java - JIT 不编译大型方法的理由是什么?

    algorithm - 两种编写函数的方法,效率有何不同?