[英]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.