scipy.weave的限制用于更复杂的性能代码

时间:2014-03-08 14:51:05

标签: python performance scipy f2py

  1. 使用 weave.inline() 调用函数是否有任何开销 比较直接调用native(C,Fortran)静态编译函数?我担心 weave.inline()每次调用函数时都会编译代码(幸运的是它没有这样做),但是我仍然担心如果执行某些测试可能会减慢速度代码已编译或未编译(我不知道它是如何工作的。)
  2. 是否可以使用 weave.inline() 编写更复杂(多功能)的C代码?我试过了,我收到了错误a function-definition is not allowed here before '{' token
  3. 是否有可能以这种方式编译代码,我可以独立调用函数

  4. Bacground / application / example

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

    因为我发现很难在Windows下使f2py工作而且我想制作多平台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-Body问题中的力)制作一个单独的函数,而不是我得到错误a function-definition is not allowed here before '{' token

    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)    
    

1 个答案:

答案 0 :(得分:2)

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

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

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

注意奇怪的引用。来自docs

  

headers:[str],optional指定头文件的字符串列表   在编译代码时使用。列表可能看起来像   [ “”, “ 'my_header'”]。请注意,标题字符串需要在   一个表格,可以粘贴在#include语句的末尾   C ++代码。