声明Numba Vectorize返回两个变量

时间:2017-05-16 18:48:18

标签: python performance python-2.7 optimization numba

为了提高循环的性能,我使用了Numba矢量化方法。

s1 = pd.Series([1,3,5,6,8,10,1,1,1,1,1,1])
s2 = pd.Series([4,5,6,8,10,1,7,1,6,5,4,3])

ding=pd.DataFrame({'A':s1,'B':s2})

@numba.vectorize(['float64(int16,int16)'])
def sumd(a,b):    
    if a==1:
        return (a+b)
    else:
        return 0

ding['sum']=sumd(ding.A,ding.B)

现在我想返回另一个变量,它是cols A和B的乘积。即我的目标是使用vectorize方法从函数返回两个变量。我不知道如何初始化numba.vectorize方法。请帮我。我愿意倾听任何其他方法来提高方法的效率。

我尝试过的一种替代方法如下,但这对我来说似乎有点复杂。我正在寻找更简单的方法来优化功能。提前谢谢。

s1 = pd.Series([1,3,5,6,8,10,1,1,1,1,1,1])
s2 = pd.Series([4,5,6,8,10,1,7,1,6,5,4,3])

ding=pd.DataFrame({'A':s1,'B':s2})

@numba.vectorize(['float64(int16,int16)'])
def sumd(a,b):    
    if a==1:
        sumarr.append((a+b))
        prodarr.append(a*b)
        return 1
    else:
        sumarr.append(0)
        prodarr.append(0)
        return 1

sumarr=[]
prodarr=[]
sumd(ding.A,ding.B)
ding['sum']=sumarr
ding['prod']=prodarr

2 个答案:

答案 0 :(得分:3)

您无法从<route> <from uri="activemq:queue:myQueue" /> <loop> <simple>100</simple> <when> <simple>${bean:myService?method=isReady}</simple> <to uri="bean:myService?method=doWork" /> </when> </loop> </route> 返回多个值,并且使用全局列表无效。我只想使用标准的jit函数:

vectorize

注意,我传递了每列的@nb.jit(nopython=True) def sumd(a, b): sumx = np.zeros_like(a, dtype=np.float64) prodx = np.zeros_like(a, dtype=np.float64) for i in range(a.shape[0]): if a[i] == 1: sumx[i] = a[i] + b[i] prodx[i] = a[i] * b[i] return sumx, prodx sumx, prodx = sumd(ding.A.values, ding.B.values) ding['sum'] = sumx ding['prod'] = prodx ,以便我可以在values模式下使用numba,因为这总是更有效率。

答案 1 :(得分:0)

您可以尝试: 1.添加一个额外的变量,该变量应在sum和product之间选择,并且基本上将您的代码运行2次,这对并行和cuda目标很有帮助

@numba.vectorize(['float64(int16,int16,int16)']) 
if retopt ==1:
    return (a+b)
if retopt ==2:
    return (a*b)
  1. 掩盖您求和并乘积返回值 例如如果您知道max(abs(s1,s2))= 37 kbypass =下一个幅度(37)= 100

    return = kbypass * product + sum

然后像

product, sum= divmod(out, kBypass)