numba@jit比纯python慢?

numba@jit比纯python慢?,python,parallel-processing,jit,numba,Python,Parallel Processing,Jit,Numba,因此,我需要改进我一直在编写的脚本的执行时间。我开始与numba jit decorator合作,尝试并行计算,但它让我感到困惑 KeyError: "Does not support option: 'parallel'" 因此,我决定测试nogil,如果它能从我的cpu解锁所有功能,但它比纯python慢,我不明白为什么会发生这种情况,如果有人能帮助我或指导我,我将非常感激 import numpy as np from numba import * @jit(['float64[:,:]

因此,我需要改进我一直在编写的脚本的执行时间。我开始与numba jit decorator合作,尝试并行计算,但它让我感到困惑

KeyError: "Does not support option: 'parallel'"
因此,我决定测试nogil,如果它能从我的cpu解锁所有功能,但它比纯python慢,我不明白为什么会发生这种情况,如果有人能帮助我或指导我,我将非常感激

import numpy as np
from numba import *
@jit(['float64[:,:],float64[:,:]'],'(n,m),(n,m)->(n,m)',nogil=True)
def asd(x,y):
    return x+y
u=np.random.random(100)
w=np.random.random(100)

%timeit asd(u,w)
%timeit u+w
10000个回路,最佳3个:每个回路137µs 最慢的跑步比最快的跑长7.13倍。这可能意味着正在缓存中间结果
1000000个循环,最好是每个循环3:1.75µs

在这样一个简单的矢量化操作中,您不能期望numba的性能优于numpy。此外,您的比较也不完全公平,因为numba函数包含外部函数调用的成本。如果对较大的数组求和,您将看到这两个数组的性能收敛,并且您看到的只是一个非常快速的操作的开销:

import numpy as np
import numba as nb

@nb.njit
def asd(x,y):
    return x+y

def asd2(x, y):
    return x + y

u=np.random.random(10000)
w=np.random.random(10000)

%timeit asd(u,w)
%timeit asd2(u,w)

The slowest run took 17796.43 times longer than the fastest. This could mean 
that an intermediate result is being cached.
100000 loops, best of 3: 6.06 µs per loop

The slowest run took 29.94 times longer than the fastest. This could mean that 
an intermediate result is being cached.
100000 loops, best of 3: 5.11 µs per loop
就并行功能而言,对于这个简单的操作,您可以使用
nb.vectorize

@nb.vectorize([nb.float64(nb.float64, nb.float64)], target='parallel')
def asd3(x, y):
    return x + y

u=np.random.random((100000, 10))
w=np.random.random((100000, 10))

%timeit asd(u,w)
%timeit asd2(u,w)
%timeit asd3(u,w)
但是,如果您在小型阵列上操作,您将看到线程调度的开销。对于上面的数组大小,我看到并行程序给了我2倍的加速


numba真正出色的地方是使用广播进行在numpy中很难执行的操作,或者操作会导致大量临时中间数组分配

Hi@JoshAdel谢谢你的回答,我真正的代码是一个优化算法,所以它必须在同一个函数上迭代并检查是否有改进,所以我不知道如果我将执行最多的函数矢量化,Aguaments值和嵌套函数的数量的不断变化是否会是一个问题。再次感谢你