gpt4 book ai didi

python - 使用 scipy.weave.inline 时出错

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:20 24 4
gpt4 key购买 nike

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

最佳答案

需要三个小改动:

  • 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')

关于python - 使用 scipy.weave.inline 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com