[英]@njit issues with iterable definition for min function
我試圖定義一個@njit
函數,該函數在幾個點上需要計算最小值。 這樣做如下工作:
min(arg1, arg2,...)
但是,當我計算可迭代的最小值時,無論如何定義可迭代,似乎都存在問題。 我用下面的一個小函數復制了它:
itrbl = [5.0, 0.4, 4.5, 3.5, 6.4]
@njit
def funct(itrbl):
return min(itrbl)
funct(itrbl)
並得到以下錯誤:
TypingError: Invalid usage of Function(<built-in function min>) with parameters (reflected list(float64))
* parameterized
當我將itrbl
結構itrbl
數組時,似乎也不喜歡...我如何構造itrbl
以使此簡單函數起作用?
在njit
ted函數中,這些函數調用被這些函數的numba版本取代。 因此,當您調用min
它不是Python的min
函數。
同樣,numba通常也已針對使用numpy.array
而不是list
進行了優化。 當您將list
傳遞給numba njit
ted函數(從Python)或從njit
ted函數返回list
(至Python)時,它必須將整個列表轉換(復制)為反射列表,或者在返回時使用其他方法( 為什么將列表(長度為n)傳遞給numba nopython函數是O(n)操作 )。 因此,您應避免將Python列表傳遞給numba函數或將其返回。 但是,在numba函數中創建列表並將其傳遞給其他numba函數不會受到此轉換開銷的影響。
但這與numba函數中有關list
和min
的實際問題無關。 看來min
的numba版本不支持列表/數組(但它確實支持元組)。
您可以輕松創建一個支持列表的numba函數:
from numba import njit
@njit
def my_min(lst):
"Don't pass empty arrays/lists to this function!"
min_ = lst[0]
for item in lst:
if item < min_:
min_ = item
return min_
哪個似乎有效:
from numba import njit
@njit
def funct(itrbl):
return my_min(itrbl)
>>> funct([5.0, 0.4, 4.5, 3.5, 6.4])
0.4
但是,更好的方法是在number函數中使用array
。 原因是,根據我在numba上的經驗,您經常遇到numba不支持列表的情況(例如min
),或者在列表上調用方法的速度相對較慢。 同樣,將列表傳遞給numba函數或從numba函數返回它們的開銷也可能是巨大的(並且是意外的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.