首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scipy.weave.inline出错

使用scipy.weave.inline出错
EN

Stack Overflow用户
提问于 2013-06-07 17:06:52
回答 2查看 1.3K关注 0票数 3

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

我的weave.inline()代码给了我一个scipy.weave.build_tools.CompileError。我已经创建了一个极简的代码,它会产生同样的错误。有人能帮忙吗?

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-07 19:02:05

需要进行三项小改动:

  • 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作用域中保存结果。

这是最终结果:

代码语言:javascript
复制
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')
票数 3
EN

Stack Overflow用户

发布于 2013-06-07 19:01:02

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

代码语言:javascript
复制
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 (都是ints)与长度为1的N个数组进行比较,这也会产生一个错误。但是,如果您将代码称为:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16989472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档