Numba @jit 无法加快此功能的性能。无论如何要解决这个问题?
Numba @jit fails to speed up the performance of this function. Anyway to fix that?
我对 python 中的 numba 包还很陌生。我不确定我是否正确使用 numba.jit,但代码运行速度太慢,每行循环 23.7 秒: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))
要使 Numba 正常工作,您需要使用 "nopython" 模式,如您所述。要启用此功能,只需将带有 jit
的程序 运行 替换为 njit
(或等同于 jit(nopython=True)
,并一一修复错误:
- np.empty() 不支持 Numba 中的
dtype='float64'
参数。不过没关系,因为 float64 是默认值。删除它即可。
- np.average() 在 Numba 中不受支持。没关系,因为无论如何我们都没有传递任何权重,所以它与 np.mean() 相同。替换它。
- 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 倍。
奖金提示:
您可以像这样更简洁、更快速地初始化示例数据:
Y = np.arange(1000000)
X = Y * Y
结果中的前 n 个值是未初始化的垃圾。您可能想以某种方式清理它。
我对 python 中的 numba 包还很陌生。我不确定我是否正确使用 numba.jit,但代码运行速度太慢,每行循环 23.7 秒: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))
要使 Numba 正常工作,您需要使用 "nopython" 模式,如您所述。要启用此功能,只需将带有 jit
的程序 运行 替换为 njit
(或等同于 jit(nopython=True)
,并一一修复错误:
- np.empty() 不支持 Numba 中的
dtype='float64'
参数。不过没关系,因为 float64 是默认值。删除它即可。 - np.average() 在 Numba 中不受支持。没关系,因为无论如何我们都没有传递任何权重,所以它与 np.mean() 相同。替换它。
- 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 倍。
奖金提示:
您可以像这样更简洁、更快速地初始化示例数据:
Y = np.arange(1000000) X = Y * Y
结果中的前 n 个值是未初始化的垃圾。您可能想以某种方式清理它。