我有一个看起来像这样的函数:
.e1< - exp(B); .e2< - t - C; .e3< - exp(A); .e4< - .e1 * .e2; .e5< - dnorm(.e4); .e6< - .e5 * .e3; .e7< - .e6 + tol; .e8< - sigma ^ 2; .e9< - .e7 ^ 2; .e10< - Y - .e6; .e11< - .e8 * .e9; .e12< - .e11 ^ 2; .e13< - dnorm(.e4,0,1); .e14< - .e1 ^ 2; .e15< - sigma ^ 4; .e16< - (2 *(。e8 * .e7 * .e10 / .e12)+2 / .e11)* .e10; .e18< - 2 / .e7; .e19< - .e15 * .e7 ^ 4; .e20< - 2 / .e8; .e21< - .e2 ^ 2; .e24< - 2 * .e6 + 4 *(。e19 * .e10 / .e12)+ tol; .e25< - 6 * .e7; .e26< - (2 - .e20)/。e9; .e27< - .e26 + .e8 *(2 *(Y - .e24) - .e25)* .e10 / .e12; .e30< - .e27 * .e5 * .e3 + .e16; .e31< - 4 *(。e19 / .e12); .e33< - (2 + 4 *(。e15 * .e7 ^ 3 * .e10 / .e12))* .e7; .e38< - 2 * .e10; .e39< - .e18 - .e30; .e40< - sigma *(2 *((2 - .e31)* .e10) - 4 * .e7); .e43< - .e8 *(2 *(。e24 - Y)+ .e25)* .e10 / .e12;
持续超过100kb。
该函数是使用Deriv
多次区分复杂函数的结果。在这个函数中有大量的中间赋值,因为Deriv被设置为缓存重用的表达式,尽管最终这是一个简单的函数,它接受6个参数并生成一个简单的数组。它可能是一个单行程......如果你容忍一个巨大的线长。该函数由简单的算术运算和一些数学函数(exp,log ...)组成。没有循环或流量控制。
我的问题是:
这种特殊形式的功能在C中运行会大大加快吗?我理解通常在编译代码中运行得更快,但是这里的瓶颈是解释语言还是更多不可避免的事情,比如所有的分配?
自动尝试将这样的简单代码转换为C似乎是否合理?代码似乎太长了,无法手工完成。如果有人以前做过,那会有所帮助。