为什么 Numba 的“急切编译”会减慢执行速度

2024-03-28

附上一个最小的例子:

from numba import jit
import numba as nb
import numpy as np

@jit(nb.float64[:, :](nb.int32[:, :])) 
def go_fast(a): 
    trace = 0.0
    for i in range(a.shape[0]):  
        trace += np.tanh(a[i, i]) 
    return a + trace          

@jit 
def go_fast2(a): 
    trace = 0.0
    for i in range(a.shape[0]):  
        trace += np.tanh(a[i, i]) 
    return a + trace 

在 Jupyter 中运行:

x = np.arange(10000).reshape(100, 100)
%timeit go_fast(x)
%timeit go_fast2(x)

leads to

每个循环 5.65 µs ± 27.1 ns(7 次运行的平均值 ± 标准差,每次 100000 个循环)

每个循环 3.8 µs ± 46.6 ns(7 次运行的平均值 ± 标准差,每次 100000 个循环)

为什么急切的编译会导致执行速度变慢?


知道内存访问是连续的可以简化优化器的寿命(这里是一个例子 https://stackoverflow.com/q/49058949/5769463对于 Cython,但类似的情况也适用于 numba,即使 clang 通常比 gcc 更聪明)。

你的例子似乎是这样的情况:

  1. 如果没有“热切编译”,numba 将检测到数据是 C 连续的并利用它,例如用于矢量化。
  2. 通过急切编译,您不提供此信息,因此优化器必须考虑到内存访问可能是不连续的,并且将创建一个性能低于第一个版本的即时代码。

因此,您应该提供更精确的签名:

@jit(nb.float64[:, ::1](nb.int32[:, ::1])) 
def go_fast3(a): 
    trace = 0.0
    for i in range(a.shape[0]):  
        trace += np.tanh(a[i, i]) 
    return a + trace

[:,::1] 告诉numba https://numba.pydata.org/numba-doc/dev/reference/types.html#arrays,数据将是 C 连续的,一旦使用此信息:

x = np.arange(10000).astype(np.int32).reshape(100, 100)
%timeit go_fast(x)     # 15.6 µs ± 241 ns per loop
%timeit go_fast2(x)    # 8.2 µs ± 90.7 ns per loop
%timeit go_fast3(x)    # 8.2 µs ± 49.6 ns per loop

急切编译的版本没有区别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Numba 的“急切编译”会减慢执行速度 的相关文章

  • Python3:如何“不”四舍五入到最接近的偶数?

    我知道Python3的round 函数四舍五入到最接近的偶数 我怎样才能防止这种情况发生并使其像Python2那样从零舍入一半 您可以使用Decimal and ROUND HALF UP from decimal https docs p
  • scipy.stats....rvs 和 numpy.random 随机抽取之间的区别

    看起来是否是相同的分布 从中抽取随机样本numpy random比这样做更快scipy stats rvs 我想知道是什么原因导致两者之间的速度差异 scipy stats uniform实际上使用了numpy 这里是stats中对应的函数
  • sklearn pipeline + keras顺序模型-如何获取历史记录?

    Keras https keras io模型 当 fit被调用时 返回一个历史对象 如果我将此模型用作 sklearn 管道的一步 是否可以检索它 顺便说一句 我正在使用 python 3 6 提前致谢 History 回调记录每个时期的训
  • Numpy 的舍入方式与 Python 不同

    The code import numpy as np a 5 92270987499999979065 print round a 8 print round np float64 a 8 gives 5 92270987 5 92270
  • 在python中访问超级(父)类变量

    我是Python新手 我尝试使用 super 方法访问子类中的父类变量 但它抛出错误 无参数 使用类名访问类变量是可行的 但我想知道是否可以使用 super 方法访问它们 class Parent object props a str a
  • 使用 NaN 计算 numpy 数组中的移动平均值

    我正在尝试计算包含 NaN 的大型 numpy 数组中的移动平均值 目前我正在使用 import numpy as np def moving average a n 5 ret np cumsum a dtype float ret n
  • Pandas - 按每个可能的键组合聚合

    我有一个 DataFrame Pandas 我想通过 A B C 和 D 列的组合尽可能按数据进行分组 假设它具有以下形式 A B C D E F G 0 Y X Y Z 1 2 7 1 Y X Y Z 3 4 8 2 X Y U V 1
  • 如何使用 Misc.imread 将图像分割为红色、绿色和蓝色通道

    我正在尝试将图像切片为 RGB 但在绘制这些图像时遇到问题 我使用此函数从某个文件夹获取所有图像 def get images path image type image list for filename in glob glob pat
  • numpy 中的分层抽样

    在 numpy 中我有一个这样的数据集 前两列是索引 我可以通过索引将数据集分成多个块 即第一个块是 0 0 第二个块是 0 1 第三个块 0 2 然后是 1 0 1 1 1 2 等等 每个块至少有两个元素 索引列中的数字可能会有所不同 我
  • 将 Django OAuth2 提供程序与 JupyterHub 结合使用

    我正在尝试运行与 JupyterHub 服务器配对的 Django Web 应用程序 用户通过 Web 应用程序输入 然后在登录后获得对笔记本服务器的访问权限 为了促进这一点 我尝试使用OAuth2 其中 Django 提供身份验证 Jup
  • 在tensorflow .ckpt文件中使用预训练模型

    我有一个 ckpt 文件 我只想得到 cnn 的权重 我已经从 ckpt 检查点文件中进行了训练 inception resnet v2 2016 08 30 import tensorflow as tf saver tf train S
  • 向量化 numpy bincount

    我有一个 2d numpy 数组 A我要申请np bincount 到矩阵的每一列A生成另一个二维数组B由原始矩阵每列的 bincounts 组成A 我的问题是 np bincount 是一个采用一维数组的函数 它不是像这样的数组方法B A
  • 如何得到将外力映射到广义力的矩阵?

    给定一个多体植物 我需要找到将外力 lambda 转换为广义力的矩阵 IE 以下方程中的 Phi 取自 Scott Kuindersma Frank Permenter 和 Russ Tedrake 的 稳定动态运动的有效可解二次规划 我的
  • 在同一进程中多次运行Scrapy

    我有一个网址列表 我想抓取其中的每一个 请注意 将此数组添加为start urls不是我正在寻找的行为 我希望它在单独的爬网会话中一一运行 我想在同一个进程中多次运行Scrapy 我想将 Scrapy 作为脚本运行 如常见做法 https
  • Python 3 - 编码/解码与字节/Str [重复]

    这个问题在这里已经有答案了 我是 python3 的新手 来自 python2 我对 unicode 基础知识有点困惑 我读过一些很好的帖子 这让一切变得更加清晰 但是我看到 python 3 上有两种方法可以处理编码和解码 但我不确定使用
  • Kivy - 获取任何 Android 设备上 DCIM 文件夹的路径

    我想确切地知道如何仅使用 Kivy 获取 Android 上 DCIM 文件夹的路径 PyJinus 不是一个选项 因为它目前不适用于 Python 3 5 到目前为止我尝试过的是 DATA FOLDER os getenv EXTERNA
  • 让 distutils 在正确的位置查找 numpy 头文件

    在我的安装中 numpy 的arrayobject h位于 site packages numpy core include numpy arrayobject h 我编写了一个使用 numpy 的简单 Cython 脚本 cimport
  • 如何导入Python文件?

    抱歉 这绝对是重复的 但我找不到答案 我正在使用 Python 3 这是我的应用程序的结构 home common py australia new south wales fetch py 我在home 目录 运行fetch py 我如何
  • 有没有办法使用 openpyxl 或 xlsxwriter 保护工作簿?

    我正在尝试自动化 Excel 报告 并且我希望用户不要尝试重命名或重新排序工作表 虽然我使用 xlsxwriter 保护单个单元格没有问题 但我没有看到保护工作簿本身的选项 我正在寻找 openpyxl 但教程似乎没有任何效果 编辑 我现在
  • C++ 相当于 std::vector 上的 numpy.unique,具有 return_index 和 return_inverse

    numpy有一个实施unique返回的算法 the 排序的唯一元素一个 numpy 数组 i e 没有重复项 此外 numpy unique https numpy org doc stable reference generated nu

随机推荐

  • 在 Karma 运行所有测试之前执行角度代码?

    是否可以在 karma 中执行某种初始化编码 在执行测试之前 我需要运行这样的代码 angular module module common brand constant BRAND brandname 我的应用程序当前需要这个模块 和这个
  • 批量发送API调用

    我目前正在尝试模拟 50 万个 IoT 设备 以使用 Nodejs 将有效负载推送到 Azure IoT 中心 由于节点本质上是多线程的 因此它的物联网中心充满了数据 并且我收到了网络错误 我还尝试了异步 等待方法 但这需要花费大量时间将数
  • 使用 SciPy 拟合贝塞尔曲线

    我有一组近似二维曲线的点 我想使用 Python 与 numpy 和 scipy 来查找近似拟合点的三次贝塞尔路径 其中我指定两个端点的精确坐标 并返回其他两个控制点的坐标 我最初以为scipy interpolate splprep 可能
  • PHP - 小时差(HH:MM 格式)

    我正在尝试计算在这里工作的人的轮班模式 从结束时间中减去开始时间在很大程度上是可行的 但如果他们通宵工作则不行 例如某人工作于10pm to 6am将显示为 22 00 06 00 我希望它能回来8 hours 但我就是想不出最好的方法 令
  • 谷歌图表趋势线未显示

    我有一个 Google 图表折线图 我想在其上显示趋势线 但它没有显示 数据是从数据库中获取的 而 JavaScript 是由 PHP 生成的 但生成的 JavaScript 如下所示
  • LINQ 查询中的分组依据

    我有一个 DataTable 我想在其中执行 GroupBy 查询 year url type id someurl image 0 2003 date 0 someurl image 1 2009 date 1 我已成功对我的 ID 进行
  • WPF 动画“无法冻结此情节提要时间线树以供跨线程使用”

    我当前有一个列表框 其所选项目绑定到我的 ViewModel 上的属性 每当所选项目不为空时 我想对其执行动画 但是我不断收到以下错误 无法冻结此情节提要时间线树以供跨线程使用 并通过研究了解为什么会发生这种情况 但是我不确定需要采取什么方
  • 如何分组并获取具有 X max 的 Y 列的值? [复制]

    这个问题在这里已经有答案了 我有一个以前从未遇到过的用例 我有以下数据框 并且想要选择 y 的值 其中 x 分别为条件 i 的每个级别实现其最小值和最大值 gt library dplyr gt df lt data frame i c 1
  • 在 ubuntu 20.04 上运行 Tensorflow 时出现“无法加载动态库 'libcudnn.so.8'”

    注意 有很多类似的问题 但是针对不同版本的 ubuntu 和有些不同的特定库 我一直无法弄清楚符号链接 其他环境变量的组合 例如LD LIBRARY PATH会工作 这是我的nvidia配置 nvidia smi Tue Apr 6 11
  • 相当于 dash shell 中的 pipelinefail

    有没有类似的选项dash外壳对应于pipefail in bash 或者如果管道中的命令之一失败 但不退出 则获得非零状态的任何其他方式 set e would 为了更清楚地说明这一点 这是我想要实现的目标的示例 在示例调试 makefil
  • 在 Slack 中合并消息菜单和消息按钮

    我想在我的 Slack 应用程序中结合消息菜单和消息按钮 这是我想要实现的工作流程 1 用户发出斜杠命令来显示菜单 该菜单将有一个下拉菜单和三个按钮 这是我能够实现的 2 我希望用户从下拉列表中选择一个选项 然后按任何操作按钮 然后只应触发
  • Warshall算法思想及改进[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 Warshall Floyd 算法 https en wikipedia org wiki Floyd E2 80 93Warshall a
  • 基于点的线/平面相交

    我在空间中有两个点 L1 和 L2 它们定义了一条线上的两个点 我在空间中有三个点 P1 P2 和 P3 这三个点在平面上 那么给定这些输入 直线在什么点与平面相交 外汇 平面方程 A x B y C z D 0 为 A p1 Y p2 Z
  • 我可以让一个标识字段跨越 SQL Server 中的多个表吗?

    我可以有一个跨多个表的 身份 唯一的 非重复的 列吗 例如 假设我有两个表 书籍和作者 Authors AuthorID AuthorName Books BookID BookTitle BookID 列和AuthorID 列是标识列 我
  • 检测滚动方向

    所以我尝试使用 JavaScripton scroll调用函数 但我想知道是否可以在不使用 jQuery 的情况下检测滚动的方向 如果没有那么有什么解决方法吗 我本来想只放一个 到顶部 按钮 但如果可以的话我想避免这种情况 我现在刚刚尝试使
  • Winsock,仅接受来自特定IP地址的请求

    如何使 Winsock 程序仅接受来自特定地址的连接请求 我希望完全忽略被拒绝的连接 而不是得到 TCP 拒绝 要使 Winsock 程序仅接受来自特定 IP 地址的连接 请使用以下条件接受机制WSAAccept http msdn mic
  • jQuery 事件在 asp.net mvc(4) 第二部分中的部分视图发布后停止工作

    I have a View with the following layout The parent View is composed of several PartialViews One of which is a list where
  • 将 Grails 2.1.1 应用程序部署到 Tomcat 作为爆炸战争?

    我正在尝试在 OpenShift 上部署 Grails 应用程序 并且尝试避免每次更改都在网络上推送 50MB 的文件 我创建了一个项目 dev apps grails test测试它 基于这个答案 https stackoverflow
  • 如何使用批处理文件运行R语言(.r)文件?

    我想使用批处理文件运行 R 脚本文件 r 如果 R exe 在您的 PATH 中 那么您的 Windows 批处理文件 bat 将仅包含一行 R CMD BATCH your r script R 否则 您需要给出 R exe 的路径 例如
  • 为什么 Numba 的“急切编译”会减慢执行速度

    附上一个最小的例子 from numba import jit import numba as nb import numpy as np jit nb float64 nb int32 def go fast a trace 0 0 fo