簡體   English   中英

如何加快numba中的dict查找任務?

[英]How to speed up dict find task in numba?

我有一個python函數,並想用numba加快速度。 最耗時的部分是在集合/字典中搜索元組。 任何人都可以提出解決方案的想法嗎?

idNeg = np.array([[1,2,3], [4,5,6], ..., [7,8,9]])
validSet = {(1,2,3):True, (5,4,3):True, ..., (2,5,3):True}
@jit
def CalcNeg(idNeg, validSet):
    l = len(idNeg)
    for j in xrange(l):
        corplc = np.random.choice([0, 2])
        idNeg[j, corplc] = random.randrange(0, VE.shape[0])
        while validSet.has_key((idNeg[j, 0], idNeg[j, 1], idNeg[j, 2])):
            idNeg[j, corplc] = random.randrange(0, VE.shape[0])
    return idNeg

我這樣嘗試過,但是與沒有@jit的代碼相比,速度沒有變化。

我對所需輸入(內容或典型形狀)的確切性質尚不是100%清楚,但是在Numba中獲得良好性能增益的關鍵是能夠在nopython模式下(相對於python對象模式)啟動一個函數。 。 原始函數使用了數據結構,特別是字典,目前不支持該結構。

同樣,我不知道確切的用例或以下修改是否有效,但是我接受了validSet dict,並將其鍵轉換為鍵值對中的值為True的真實設置對象。

舉個例子:

import numpy as np
import numba as nb
import random

# Original function
def CalcNeg(idNeg, validSet, N):
    l = len(idNeg)
    for j in xrange(l):
        corplc = np.random.choice([0, 2])
        idNeg[j, corplc] = random.randrange(0, N)
        while validSet.has_key((idNeg[j, 0], idNeg[j, 1], idNeg[j, 2])):
            idNeg[j, corplc] = random.randrange(0, N)
    return idNeg

# Modified version, compiled in nopython mode (njit)
@nb.njit
def CalcNeg2(idNeg, validSet, N):
    l = len(idNeg)
    c = np.array([0,2])
    for j in xrange(l):
        corplc = np.random.choice(c)
        idNeg[j, corplc] = random.randrange(0, N)
        #while validSet.has_key((idNeg[j, 0], idNeg[j, 1], idNeg[j, 2])):
        while (idNeg[j, 0], idNeg[j, 1], idNeg[j, 2]) in validSet:
            idNeg[j, corplc] = random.randrange(0, N)
    return idNeg

# Some test data
N = 40
M = 2000
idNeg = np.random.random_integers(0, N, size=(M,3))
tmp = np.random.random_integers(0, N, size=(M,3))
validSet = {tuple(tmp[k,:]): True for k in xrange(tmp.shape[0])}

# convert validSet to real python set for keys with value == True
_validSet = {k for k,v in validSet.iteritems() if v is True}

現在,使用%timeit魔術從ipython筆記本中進行一些計時:

%timeit CalcNeg(idNeg, validSet, N)
100 loops, best of 3: 7.84 ms per loop

%timeit CalcNeg2(idNeg, _validSet, N)
1000 loops, best of 3: 444 µs per loop

因此,在我的機器上,速度提高了18倍。 我正在使用Numba 0.25。 只是要注意,切換到原始python函數中的集合會產生很小的差異,但更像是25%的加速。

如果測試數據不切實際,或者將dict轉換為集合不合適,請告訴我。 沒有更多細節,很難說出如何解決該問題。

暫無
暫無

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

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