gpt4 book ai didi

python - numba @jit 比纯 python 慢?

转载 作者:太空宇宙 更新时间:2023-11-03 14:51:58 25 4
gpt4 key购买 nike

所以我需要改进我一直在处理的脚本的执行时间。我开始使用 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)

但同样,如果您对小型数组进行操作,您将看到线程分派(dispatch)的开销。对于上面的数组大小,我看到并行给了我 2 倍的加速。

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

关于python - numba @jit 比纯 python 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com