gpt4 book ai didi

python - 为什么 Numba 不改进这个迭代......?

转载 作者:行者123 更新时间:2023-11-28 22:50:13 25 4
gpt4 key购买 nike

我正在试用 Numba 来加速计算联合发生的最小条件概率的函数。

    import numpy as np
from numba import double
from numba.decorators import jit, autojit

X = np.random.random((100,2))

def cooccurance_probability(X):
P = X.shape[1]
CS = np.sum(X, axis=0) #Column Sums
D = np.empty((P, P), dtype=np.float) #Return Matrix
for i in range(P):
for j in range(P):
D[i, j] = (X[:,i] * X[:,j]).sum() / max(CS[i], CS[j])
return D

cooccurance_probability_numba = autojit(cooccurance_probability)

但是我发现 cooccurance_probabilitycooccurance_probability_numba 的性能几乎相同。

%timeit cooccurance_probability(X)
1 loops, best of 3: 302 ms per loop

%timeit cooccurance_probability_numba(X)
1 loops, best of 3: 307 ms per loop

这是为什么?会不会是numpy逐元素操作的原因?

我举个例子: http://nbviewer.ipython.org/github/ellisonbg/talk-sicm2-2013/blob/master/NumbaCython.ipynb

[注意:由于问题的对称性,我可以将执行时间减半——但这不是我主要关心的问题]

最佳答案

我的猜测是,由于调用了 sum,您正在访问对象层而不是生成 native 代码,这意味着 Numba 不会显着加快速度。它只是不知道如何优化/翻译 sum(此时)。此外,通常最好使用 Numba 将矢量化操作展开到显式循环中。请注意,您链接到的 ipynb 只调用 np.sqrt 我相信它确实被翻译成机器代码,并且它对元素而不是切片进行操作。我会尝试将内循环中的总和扩展为对元素的显式附加循环,而不是获取切片并使用 sum 方法。

我的经验是 Numba 有时可以创造奇迹,但它不会加速任意 python 代码。您需要了解其局限性以及它可以有效优化的内容。另请注意,与 0.12 和 0.13 相比,v0.11 在这方面略有不同,因为 Numba 在这些版本之间进行了重大重构。

关于python - 为什么 Numba 不改进这个迭代......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22853837/

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