Numba @jit无法加快此功能的性能。无论如何要解决这个问题?

时间:2018-10-21 03:59:43

标签: python-3.x performance numpy optimization numba

我对python中的numba软件包很陌生。我不确定我是否正确使用了numba.jit,但是该代码的运行速度太慢,每循环23.7s:Z1 = mmd(X,Y,20) 优化代码的正确方法是什么?我需要你们的帮助。谢谢。

这是我的代码:

import pandas as pd
import numba as nb
import numpy as np
@nb.jit
def mmd(array1, array2, n):
    n1 = array1.shape[0]
    MMD = np.empty(n1, dtype = 'float64')

    for i in range(n-1,n1):
        MMD[i] = np.average(abs(array1[i+1-n:i+1] - array2[i]))

    return MMD

X = np.array([i**2 for i in range(1000000)])
Y = np.array([i for i in range(1000000)])
Z1 = mmd(X,Y,20)

编辑:进一步简化了代码

EDIT2:尝试了@ nb.jit(nopython = True),然后出现错误消息:

KeyError: "<class 'numba.targets.cpu.CPUTargetOptions'> does not support option: 'nonpython'"

也尝试过:

@nb.jit(nb.float32[:](nb.float32[:],nb.float32[:],nb.int8))

1 个答案:

答案 0 :(得分:3)

要使Numba正常工作,您需要使用“ nopython”模式,如上所述。要启用此功能,只需运行程序,将jit替换为njit(或等效地jit(nopython=True),然后逐一修复错误:

  1. np.empty()在Numba中不支持dtype='float64'参数。没关系,因为float64是默认设置。只需将其删除即可。
  2. Numba不支持
  3. np.average()。没关系,因为无论如何我们都没有传递任何权重,所以它与np.mean()相同。更换它。
  4. Numba不支持内置的abs()。改用np.abs()。

我们最终得到了这个

@nb.njit
def mmd(array1, array2, n):
    n1 = array1.shape[0]
    MMD = np.empty(n1)

    for i in range(n-1,n1):
        MMD[i] = np.mean(np.abs(array1[i+1-n:i+1] - array2[i]))

    return MMD

速度快了100倍。

奖金提示:

  1. 您可以像这样简洁,快速地初始化示例数据:

    Y = np.arange(1000000)
    X = Y * Y
    
  2. 结果中的前n个值是未初始化的垃圾。您可能想要以某种方式清理它。