我使用了几种技术(NumPy、Weave、Cython、Numba)来执行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()

最佳答案

需要三个小的改变:
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')

10-07 12:19