2017-09-01 457 views
4

在我的代碼中,有很多參數在運行過程中保持不變。我定義了一個dict類型變量來存儲它們。但我發現numba不支持dict將numba的字典類型替換爲python函數的參數

什麼是解決此問題的更好方法?

+0

您可以添加一點更多的上下文,以便它實際上明顯是什麼意思,什麼不工作,以及它應該如何工作:) – MSeifert

+0

好的,我會補充。我使用字典來減少函數中的參數數量。我希望用'numba'加快函數的速度,但'numba'不支持字典類型。 – WZhao

回答

2

Numba支持namedtuplesnopython模式,這應該是dict的一個很好的替代方案,用於將大量參數傳遞給numba jitted函數。

2

假設你有這樣的功能,你的罰款通過訪問它的屬性,而不是通過下標:

import numba as nb 

@nb.njit 
def func(config): 
    return config.c 

你可以使用一個collections.namedtuple這裏(如@JoshAdel提到):

import numpy as np 
from collections import namedtuple 

conf = namedtuple('conf', ['a', 'b', 'c']) 

func(conf(1, 2.0, np.array([1,2,3], dtype=np.int64))) 
# array([1, 2, 3], dtype=int64) 

還是一個jitclass:

spec = [('a', nb.int64), 
     ('b', nb.float64), 
     ('c', nb.int64[:])] 

@nb.jitclass(spec) 
class Conf: 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

func(Conf(1, 2.0, np.array([1,2,3], dtype=np.int64))) 
# array([1, 2, 3], dtype=int64) 

這些不能代替所有字典的功能,但是這些允許作爲一個例子傳遞「很多參數」。

+0

非常感謝! 'JoshAdel'和'MSeifert'。我認爲這正是我需要的。感謝這些例子。 – WZhao

+0

@ W.Zhao沒問題 - 我很高興*如果*它的作品(這是一個長鏡頭)。請不要忘記[upvote](https://stackoverflow.com/help/privileges/vote-up)所有有用的答案和[接受](https://meta.stackexchange.com/questions/5234/how - 接受答案 - 工作)最能幫助你的人。 – MSeifert