簡體   English   中英

@njit問題具有min函數的可迭代定義

[英]@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函數中有關listmin的實際問題無關。 看來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.

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