数值方法中的系数往往是固定的。我想知道Cython/C中设置这样的数组或变量的最佳方法是什么。在
在我的例子中,除了系数和级数外,Runge-Kutta积分方法基本相同。现在我正在做类似(简化)
# Define some struct such that it can be used for all different Runge-Kutta methods
ctypedef struct RKHelper:
int numStages
double* coeffs
cdef:
RKHelper firstRKMethod
# Later secondRKMethod, thirdRKMethod, etc.
firstRKMethod.numStages = 3
firstRKMethod.coeffs = <double*> malloc(firstRKMethod.numStages*sizeof(double))
# Arrays can be large and most entries are zero
for ii in range(firstRKMethod.numStages):
firstRKMethod.coeffs[ii] = 0.
# Set non-zero elements
firstRKMethod.coeffs[2] = 1.3
一些要点:
有没有更好的方式来做我想做的事?在
干杯
为什么不直接使用numpy数组呢?实际上,它并不是静态的(参见末尾的注释),但您可以在全局范围内分配它,以便在模块启动时创建它。您还可以访问下面的原始C数组,这样就没有真正的效率成本。在
注意我对这个问题的理解是,您使用“static”来表示“compiled into the module”,而不是任何numerous C-related definitions或任何与Python静态方法/类变量有关的内容。在
一种实现您想要实现的方法是将Runge-Kutta方案的系数设置为全局变量,这样就可以使用静态数组。这很快,但肯定很难看
丑陋的解决方案:
更好的解决方案是定义一个
cython
类,其成员是Runge-Kutta系数优雅的解决方案:
^{pr2}$关于设置元素的问题,让我们使用
calloc
而不是malloc
来修改您自己的代码动态分配的版本:
让我们做一个有点荒谬的基准测试,来验证前两个例子中的数组是真正静态的(即没有运行时开销)
RungeKutta_StaticArray
基本上有接近no-op
的开销,这意味着数组分配没有运行时代价。您可以选择在此函数中声明coeffs
,并且计时仍然相同。尽管使用其成员和构造函数设置类的开销,RungeKutta_StaticArrayClass
仍然比动态分配的版本快。在相关问题 更多 >
编程相关推荐