【问题标题】:Declaring Numba Vectorize for returning two variables声明 Numba Vectorize 以返回两个变量
【发布时间】:2017-05-16 18:48:18
【问题描述】:

为了提高循环的性能,我使用了 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)

现在我想返回一个附加变量,它是列 A 和 B 的乘积。即,我的目标是使用矢量化方法从函数中返回两个变量。我不确定如何初始化 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

【问题讨论】:

    标签: python performance python-2.7 optimization numba


    【解决方案1】:

    您不能从vectorize 返回多个值,并且使用全局列表将不起作用。我只会使用标准的 jit 函数:

    @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,以便我可以在nopython 模式下使用numba,因为这总是更有效。

    【讨论】:

      【解决方案2】:

      您可以尝试: 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 2013-12-25
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多