为什么完全相同的函数在 ipython/jupyter 中表现不同?
Why does completely same function behave differently in ipython/jupyter?
我有两个相同的函数,比如说,sum_nb
和 sum_nb2
。我用 @njit
装饰器定义它们:
from numba import njit
from timeit import timeit
@njit
def sum_nb(n=100_000_000):
s = 0
for i in range(n):
s += i
return s
@njit
def sum_nb2(n=100_000_000):
s = 0
for i in range(n):
s += i
return s
如果我只是另存为脚本并添加代码来测量执行时间,一切都很好:
print(sum_nb())
print(sum_nb2())
print(timeit(sum_nb))
print(timeit(sum_nb2))
输出为:
4999999950000000
4999999950000000
0.41249959499691613
0.4120563520118594
现在我打开 ipython console/jupyter 实验室并将第一个代码复制到单元格中。然后我用魔法测量单元格中的代码时间:
In [3]: %timeit sum_nb()
240 ns ± 86.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit sum_nb2()
7.32 µs ± 90 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
如果在 jupyter lab 中,也会发生同样的情况。它是如何发生的?怎么运行的?为什么相同的代码速度不同?
我有 ipython 7.7.0、numba 0.44.1、python 3.7.3、jupyter lab 1.0.2
这似乎是缓存行为不一致的结果。 Jupyter 甚至将此视为一个问题:The slowest run took 74.96 times longer than the fastest. This could mean that an intermediate result is being cached.
在我的机器上,具有缓存行为的函数在 ~240ns 内运行,而没有缓存行为的函数在 ~50μs 内运行。
我发现使两个函数之间的行为一致的唯一方法是将 n=100_000_000
拉入函数体,这使得两个函数都为 ~240ns。
我有两个相同的函数,比如说,sum_nb
和 sum_nb2
。我用 @njit
装饰器定义它们:
from numba import njit
from timeit import timeit
@njit
def sum_nb(n=100_000_000):
s = 0
for i in range(n):
s += i
return s
@njit
def sum_nb2(n=100_000_000):
s = 0
for i in range(n):
s += i
return s
如果我只是另存为脚本并添加代码来测量执行时间,一切都很好:
print(sum_nb())
print(sum_nb2())
print(timeit(sum_nb))
print(timeit(sum_nb2))
输出为:
4999999950000000
4999999950000000
0.41249959499691613
0.4120563520118594
现在我打开 ipython console/jupyter 实验室并将第一个代码复制到单元格中。然后我用魔法测量单元格中的代码时间:
In [3]: %timeit sum_nb()
240 ns ± 86.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [4]: %timeit sum_nb2()
7.32 µs ± 90 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
如果在 jupyter lab 中,也会发生同样的情况。它是如何发生的?怎么运行的?为什么相同的代码速度不同?
我有 ipython 7.7.0、numba 0.44.1、python 3.7.3、jupyter lab 1.0.2
这似乎是缓存行为不一致的结果。 Jupyter 甚至将此视为一个问题:The slowest run took 74.96 times longer than the fastest. This could mean that an intermediate result is being cached.
在我的机器上,具有缓存行为的函数在 ~240ns 内运行,而没有缓存行为的函数在 ~50μs 内运行。
我发现使两个函数之间的行为一致的唯一方法是将 n=100_000_000
拉入函数体,这使得两个函数都为 ~240ns。