[英]Error using scipy.weave.inline
我正在使用幾種技術( 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()
兩個問題。 首先,您不需要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
)與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.