1 回答
TA贡献1807条经验 获得超9个赞
我做了一个小测试脚本,看看我是否可以重现你的错误:
import numba as nb
from IPython import get_ipython
ipython = get_ipython()
@nb.jit(nopython=True)
def f(x):
return (x+1)/x
def fixed_point_for(x):
for _ in range(17):
x = f(x)
return x
@nb.jit(nopython=True)
def fixed_point_for_nb(x):
for _ in range(17):
x = f(x)
return x
def fixed_point_while(x):
error=1
x_old = x
while error>0.01:
x = f(x)
error = abs(x_old-x)
x_old = x
return x
@nb.jit(nopython=True)
def fixed_point_while_nb(x):
error=1
x_old = x
while error>0.01:
x = f(x)
error = abs(x_old-x)
x_old = x
return x
print("for loop without numba:")
ipython.magic("%timeit fixed_point_for(10)")
print("for loop with numba:")
ipython.magic("%timeit fixed_point_for_nb(10)")
print("while loop without numba:")
ipython.magic("%timeit fixed_point_while(10)")
print("for loop with numba:")
ipython.magic("%timeit fixed_point_while_nb(10)")
由于我不了解您的f情况,因此我只使用了我能想到的最简单的稳定功能。然后,我在使用和不numba使用循环的情况下运行测试。我机器上的结果是:forwhile
for loop without numba:
3.35 µs ± 8.72 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
for loop with numba:
282 ns ± 1.07 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
while loop without numba:
1.86 µs ± 7.09 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
for loop with numba:
214 ns ± 1.36 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
产生以下想法:
不可能,你的函数是不可优化的,因为你的
for
循环很快(至少你是这么说的;你没有测试过numba
吗?)。如您所想,您的函数可能需要更多的循环才能收敛
我们使用不同的软件版本。我的版本是:
numba 0.49.0
numpy 1.18.3
python 3.8.2
添加回答
举报