首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.weave对更复杂性能代码的限制

scipy.weave对更复杂性能代码的限制
EN

Stack Overflow用户
提问于 2014-03-08 14:51:05
回答 1查看 468关注 0票数 1
  1. 与本机(C,Fortran)静态编译函数的直接调用相比,使用weave.inline()调用函数是否存在开销?我担心weave.inline()每次调用该函数时都会编译该代码(幸运的是,它没有编译),但我仍然担心,如果代码已经编译或不编译(我不知道它在里面是如何工作的),它可能会通过一些测试而减慢速度。
  2. 是否可以使用weave.inline()?编写更复杂的(多功能)C代码?我试过了,我得到了错误的a function-definition is not allowed here before '{' token
  3. 是否有可能以这样的方式编译代码,以便可以独立地调用函数。

Bacground /应用程序/示例

我有一个N体程序求解器,它使用f2py,由几个函数组成(一个函数计算物体间的力,另一个函数通过RKF45集成微分方程)。

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

为了举例说明,我用了一个简单得多的微分方程dA(t)/dt = -k*A(t)

代码语言:javascript
复制
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体问题中的力)做了一个单独的函数,我就会得到误差a function-definition is not allowed here before '{' token

代码语言:javascript
复制
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)    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-08 18:36:57

下面是对编译代码缓存方式的解释:编织目录

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

代码语言:javascript
复制
weave.inline(code, ['A','k','n','As'], headers=['"foo.h"'],
             type_converters=converters.blitz)

注意这个奇怪的引语。来自文档

header : str,可选字符串列表,指定在编译代码时要使用的头文件。列表看起来可能是"“、”my_header“。请注意,头字符串需要在C++代码中的#include语句末尾粘贴的表单中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22270795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档