簡體   English   中英

使用scipy.weave.inline時出錯

[英]Error using scipy.weave.inline

我正在使用幾種技術( 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()

兩個問題。 首先,您不需要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

第二個問題。 您正在將ij (兩個int )與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

需要進行三項小改動:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM