gpt4 book ai didi

python - scipy.weave 对于更复杂的性能代码的限制

转载 作者:行者123 更新时间:2023-12-01 05:21:17 26 4
gpt4 key购买 nike

  1. 使用 weave.inline() 调用函数是否有任何开销与直接调用 native (C、Fortran)静态编译函数的比较?我担心 weave.inline() 在每次调用函数时都会编译代码(幸运的是,它没有编译),但我仍然担心如果执行一些测试,它可能会减慢速度代码是否已经编译(我不知道它内部是如何工作的)。
  2. 是否可以使用weave.inline()编写更复杂(多功能)的C代码??我尝试过,但出现错误在“{”标记之前不允许使用函数定义
  3. 是否有可能以这样的方式编译代码,以便我可以独立调用函数
<小时/>

背景/应用程序/示例

我有一个使用f2pyN-Body探针求解器,它由多个函数组成(一个函数评估物体之间的力,其他函数通过RKF45积分微分方程)。

因为我发现很难让 f2py 在 Windows 下工作,并且我想要制作多平台 python 库,所以我尝试将其重写为 C 并根据本教程使用 scipy.weave http://wiki.scipy.org/PerformancePython

为了便于说明,我用更简单的微分方程 dA(t)/dt = -k*A(t) 进行了示例

from scipy import weave
from scipy.weave import converters
from pylab import *
n = 100
As = zeros(n);
def testODE(A, k, n):
code = r"for (int i=0; i<n; i++) { As(i)=A; A -= (double)k*(double)A; }"
return weave.inline(code, ['A','k','n','As'], type_converters=converters.blitz, compiler = 'gcc')
ks = arange(0.02,0.2,0.02)
for k in ks:
testODE( 10.0, k, n)
plot ( As );
show();

这工作得很好。我只是不确定 weave.inline() 调用是否会产生一些开销。

但是,如果我创建一个单独的函数来评估导数(例如 N 体问题中的力),则会出现错误在“{”标记之前不允许使用函数定义

def testODE_multiFunc(A, k, n):
code = r'''
double evalDerivatives(double a, double b){ return a*b; }
for (int i=0; i<n; i++) { As(i)=A; A -= evalDerivatives(k,A); }
'''
return weave.inline(code, ['A','k','n','As'], type_converters=converters.blitz, compiler = 'gcc', verbose=3)

最佳答案

以下是如何缓存已编译代码的说明:the weave catalog

如果您想内联复杂(多功能)C 代码,您可以在单独的头文件(例如 foo.h)中定义函数,然后将其传递给对 内联:

weave.inline(code, ['A','k','n','As'], headers=['"foo.h"'],
type_converters=converters.blitz)

请注意奇怪的引用。来自 docs :

headers : [str], optional A list of strings specifying header files to use when compiling the code. The list might look like ["","'my_header'"]. Note that the header strings need to be in a form than can be pasted at the end of a #include statement in the C++ code.

关于python - scipy.weave 对于更复杂的性能代码的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22270795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com