繁体   English   中英

为什么完全相同的 function 在 ipython/jupyter 中的行为不同?

[英]Why does completely same function behave differently in ipython/jupyter?

我有两个相同的函数,比如sum_nbsum_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))

output 是:

4999999950000000
4999999950000000
0.41249959499691613
0.4120563520118594

现在我打开 ipython 控制台/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 实验室中也会发生同样的情况。 它是如何发生的? 这个怎么运作? 为什么相同的代码有不同的速度?

我有 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. The slowest run took 74.96 times longer than the fastest. This could mean that an intermediate result is being cached.

在我的机器上,具有缓存行为的 function 运行时间约为 240ns,而没有缓存行为的运行时间约为 50μs。

我发现使两个函数之间的行为保持一致的唯一方法是将n=100_000_000拉入 function 的主体中,这使得两个函数都约为 240ns。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM