3

我正在使用几种技术(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()
4

2 回答 2

3

两个问题。首先,您不需要 line 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

第二题。您正在将iand j(both ints) 与 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
于 2013-06-07T19:01:02.737 回答
3
于 2013-06-07T19:02:05.640 回答