为什么完全相同的函数在 ipython/jupyter 中表现不同?

如何解决为什么完全相同的函数在 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))

输出为:

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.

在我的机器上,具有缓存行为的函数在 ~240ns 内运行,而没有缓存行为的函数在 ~50μs 内运行。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?