繁体   English   中英

使用scipy.weave.inline时出错

[英]Error using scipy.weave.inline

我正在使用几种技术( NumPyWeaveCythonNumba )来执行Python性能基准测试。 该代码采用两个大小为NxN的numpy数组,并将它们按元素相乘并将值存储在另一个数组C中。

我的weave.inline()代码给了我一个scipy.weave.build_tools.CompileError 我创建了一个极简主义的代码片段,它会产生相同的错误。 有人可以帮忙吗?

import time

import numpy as np
from scipy import weave
from scipy.weave import converters


def benchmark():

    N = np.array(5000, dtype=np.int)

    A = np.random.rand(N, N)
    B = np.random.rand(N, N)
    C = np.zeros([N, N], dtype=float)

    t = time.clock()
    weave_inline_loop(A, B, C, N)
    print time.clock() - t


def weave_inline_loop(A, B, C, N):
    code = """
           int i, j;
           for (i = 0; i < N; ++i)
           {
               for (j = 0; j < N; ++j)
               {
                   C(i, j) = A(i, j) * B(i, j);
               }
           }
           return_val = C;
           """
    C = weave.inline(code, ['A', 'B', 'C', 'N'], type_converters=converters.blitz, compiler='gcc')

benchmark()

两个问题。 首先,您不需要return_val = C 您正在内联代码中直接操作变量C中的数据,因此它已经可用于python并且不需要显式地将其返回到环境中(并且尝试这样做会导致在尝试执行适当的类型转换时出错) 。 所以将你的功能改为:

def weave_inline_loop(A, B, C, N):
    code = """
           int i, j;
           for (i = 0; i < N; ++i)
           {
               for (j = 0; j < N; ++j)
               {
                   C(i, j) = A(i, j) * B(i, j);
               }
           }
           """
    weave.inline(code, ['A', 'B', 'C', 'N'], type_converters=converters.blitz, compiler='gcc')
    return C

第二个问题。 您正在将ij (两个int )与N长度为1的数组进行比较。这也会产生错误。 但是,如果您将代码称为:

def benchmark():

    N = np.array(5000, dtype=np.int)

    A = np.random.rand(N, N)
    B = np.random.rand(N, N)
    C = np.zeros([N, N], dtype=float)

    t = time.clock()
    print weave_inline_loop(A, B, C, int(N)) 
    # I added a print statement so you can see that C is being 
    # populated with the new 2d array
    print time.clock() - t

需要进行三项小改动:

  • N不能是0D-numpy数组(它必须是一个整数,以便i < N在C代码中起作用)。 您应该写N = 5000而不是N = np.array(5000, dtype=np.int)

  • C阵列正在进行就地修改,因此不必返回。 我不知道对象类型的限制比return_val可以处理,但如果你试图保持return_val = C; 它编译失败: don't know how to convert 'blitz::Array<double, 2>' to 'const py::object&'

  • 之后, weave.inline返回None 保持赋值C = weave.inline(...使代码看起来很混乱,即使它工作正常,名为C的数组也会将结果保存在benchmark范围内。

这是最终结果:

import time
import numpy as np
from scipy import weave
from scipy.weave import converters


def benchmark():
    N = 5000

    A = np.random.rand(N, N)
    B = np.random.rand(N, N)
    C = np.zeros([N, N], dtype=float)

    t = time.clock()
    weave_inline_loop(A, B, C, N)
    print time.clock() - t


def weave_inline_loop(A, B, C, N):
    code = """
           int i, j;
           for (i = 0; i < N; ++i)
           {
               for (j = 0; j < N; ++j)
               {
                   C(i, j) = A(i, j) * B(i, j);
               }
           }
           """
    weave.inline(code, ['A', 'B', 'C', 'N'], type_converters=converters.blitz, compiler='gcc')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM