编程语言
首页 > 编程语言> > numba @jit会降低纯Python的速度吗?

numba @jit会降低纯Python的速度吗?

作者:互联网

因此,我需要缩短我一直在处理的脚本的执行时间.我开始使用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的操作,或者当操作会导致大量临时中间数组分配时.

标签:parallel-processing,jit,numba,python
来源: https://codeday.me/bug/20191025/1931769.html