我正在使用多种技术( 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()
答案 0 :(得分:3)
两个问题。首先,您不需要行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
第二期。您正在将i
和j
(两个int
s)与长度为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
答案 1 :(得分:3)
需要进行三项小改动:
N
不能是一个0D-numpy数组(它必须是一个整数,以便i < N
在C代码中起作用)。您应该写N = 5000
而不是N = np.array(5000, dtype=np.int)
。
正在修改C
数组,因此不必返回它。我不知道return_val
可以处理的对象类型的限制,但如果您尝试保留return_val = C;
,则无法编译:{{1}}。
之后,don't know how to convert ‘blitz::Array<double, 2>’ to ‘const py::object&’
返回weave.inline
。保留作业None
会使代码看起来令人困惑,即使它工作正常,名为C = weave.inline(...
的数组也会将结果保存在C
范围内。
这是最终结果:
benchmark