如何使两个数组连续以便 Numba 可以加速 np.dot()

2024-01-22

我有以下代码:

import numpy as np
from numba import jit

Nx = 15
Ny = 1000

v = np.ones((Nx,Ny))
v = np.reshape(v,(Nx*Ny))
A = np.random.rand(Nx*Ny,Nx*Ny,5)
B = np.random.rand(Nx*Ny,Nx*Ny,5)
C = np.random.rand(Nx*Ny,5)
   
@jit(nopython=True)
def dotplus(B, v, C):
    return np.dot(B, v) + C

k = 2
D = dotplus(B[:,:,k], v, C[:,k])

我收到以下警告,我猜它指的是数组B[:,:,k] and v:

NumbaPerformanceWarning: np.dot() is faster on contiguous arrays, called on (array(float64, 2d, A), array(float64, 1d, C))
  return np.dot(B, v0) + C

有没有办法让两个数组连续,这样Numba就可以加速代码?

PS,如果您想知道其含义k,请注意这只是 MRE。在实际代码中,dotplus在一个内部被多次调用for循环不同的值k(因此,不同的切片B and C). The for循环更新的值v, but B and C不要改变。


缺陷是正确的。B[..., k]返回一个np.view() into B,但实际上并不复制任何数据。在内存中,视图的两个相邻元素的距离为B.strides[1],其评估结果为B.shape[-1]*B.itemsize并且大于B.itemsize。因此,您的数组不是连续的。

最好的优化是向量化dotplus循环并写入

D = np.tensordot(B, v, axes=(1, 0)) + C

第二个最佳优化是重构,让批量维度成为数组的第一个维度。这可以在上述矢量化的基础上完成,并且通常是可取的。它看起来像

A = np.random.rand(5, Nx*Ny,Nx*Ny)
# rather than
A = np.random.rand(Nx*Ny,Nx*Ny,5)

如果您无法重构代码,则需要开始分析。您可以通过以下方式轻松临时交换轴

B = np.moveaxis(B, -1, 0)
some_op(B[k, ...], ...)
B = np.moveaxis(B, 0, -1) 

与 max9111 的评论相反,与np.ascontiguousarray()因为在这两种情况下都必须复制数据。也就是说,副本是O(Nx*Ny*k)+ 缓冲区分配。直接矩阵向量乘法是O(Nx*Ny)但你必须先收集元素,这确实很昂贵。这取决于您的特定架构和具体问题,因此分析是最佳选择。

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

如何使两个数组连续以便 Numba 可以加速 np.dot() 的相关文章

随机推荐

  • jquery 的 $.ajax 中从 url 参数中删除附加 url 的方法

    我正在使用 cakephp 并想使用jQuery ajax发布到我的服务器 问题是 jQuery 的 ajax附加协议和主机名 但还包括当前控制器 因此我无法更改我粘贴的控制器 有没有办法改变 url 参数 ajax 这是我的示例邮政编码
  • 这个程序如何运作?

    include
  • Silverlight 3 和 Silverlight 4 条件 xaml

    我现在正在开发一个必须分离项目文件的项目 一个符合 Silverlight 3 另一个符合 Silverlight 4 该项目创建了一个在其他几个项目中使用的用户控件 不幸的是 其中一个处于 SL3 状态 现在无法升级 这就是为什么需要 S
  • 将目录迁移到不同的 svn 存储库

    我在 svn 存储库中有代码 将其称为存储库 A 现在假设我需要将内容移动到存储库 B 但存储库 B 已经对其他项目处于活动状态一段时间了 是否可以将特定目录从存储库 A 移动到存储库 B 同时保留文件历史记录 通常 要将整个存储库迁移到新
  • MapView 显示在灰色瓷砖地图中未显示在 android google api 2.3.3 中

    您好 我正在开发一个地图视图 我尝试遵循以下方式 我通过单击按钮创建了一个 意图 添加权限和库 我创建了一个覆盖项目 我的模拟器的目标是GoogleApi 2 3 3 我的MapView密钥已获取并分配到mapview xml中 我看到底部
  • Eclipse:快速搜索文件名

    在 Eclipse 中工作时 我经常意识到我记得类名 但忘记了该类在哪个包中 使用搜索不是很方便 点击和按键次数过多 我想知道 有没有一个插件可以简化这个过程 例如 如果包资源管理器顶部有一个文本编辑框 可以根据输入的文本过滤显示包和 ja
  • 确定 1 到 0 转换之间的时间

    我的表格显示泵的开 关状态如下 Value timestamp 1 2013 09 01 00 05 41 987 0 2013 09 01 00 05 48 987 1 2013 09 01 00 05 59 987 0 2013 09
  • 使用reduce进行分组和求和

    我想返回一个按团队分组的数组 其中包含 gp 胜利 失败的总和 我试图通过减少来实现这一点 但是总数并没有相加 这是我的代码 const myArr team Red gp 3 win 2 loss 1 team Black gp 3 wi
  • Cordova/Phonegap 社交共享

    我正在寻找一种简单的解决方案 用于在 cordova phonegap 应用程序内部共享 我希望添加 Facebook Twitter 和电子邮件共享 就像这个应用程序一样 http itunes apple com us app mars
  • 在 Yii 中设置默认时区

    我正在使用以下时区配置配置文件 timeZone gt UTC 它工作正常 所有日期都根据以下内容存储在数据库中UTC 现在每个用户在他 她的个人资料中都有自己的时区 例如UTC 5 UTC 5 UTC 0 etc 现在我如何根据用户时区在
  • 我如何知道使用 Azure 存储的代码是否会受到 2015 年 12 月即将删除的 API 版本的影响? [复制]

    这个问题在这里已经有答案了 我有一个来自微软的电子邮件 http aka ms Qga48e据说较低版本的存储服务将于 2015 年 12 月被删除 我们的应用程序使用 Azure SDK 1 8 和 2 0 我们如何确定我们是否受到此更改
  • 如何创建一个android自动启动应用程序?

    如何创建一个安卓自动启动应用程序 我的应用程序显示特殊日期通知 并且它必须自动启动 tnx 您可以使用报警管理器 http developer android com reference android app AlarmManager h
  • 如何使屏幕上的按钮水平和垂直居中且等距?

    我已经绞尽脑汁 这里是android新手 所以不难做到 有一段时间试图找出如何实现这一点 使用RelativeLayout或AbsoluteLayout以外的东西来创建它 我有 Windows 编程背景 其中设备会为您调整 绝对 定位 并且
  • 哈希集与树集

    我一直很喜欢树 真好O n log n 以及它们的整洁 然而 我认识的每一位软件工程师都尖锐地问我为什么要使用TreeSet 从 CS 背景来看 我认为你使用什么并不重要 而且我不喜欢乱搞哈希函数和存储桶 在这种情况下 Java 在什么情况
  • REDCap 自动填充早期记录中的字段

    我想用早期记录中该字段中插入的内容填充下拉菜单 不带管道的形式 具体来说 我有一个名为 杂志 如果之前有人记录过日记 代谢组学 我希望它出现在下拉菜单 或类似的菜单 中 如果日记是新的 我会添加一个文本字段 可以在其中添加新日记 感谢您的帮
  • kotlin 嵌套线程 - “此范围内有多个具有此类名称的标签”

    我有一些与此类似的 kotlin 代码 Thread Thread return Thread start start 现在我收到以下警告 我知道 kotlin 对于此时要返回哪个线程感到困惑 无论是外线程还是内线程 但我不知道如何告诉它
  • 如何查找哪些对象产生的垃圾最多

    我的应用程序包含 80 个不同类的大约 80 个实例 这些类的某些子集生成的垃圾量是不可接受的 并且停止世界的暂停时间太长 因为我的应用程序是实时的 我想找到的是哪些类负责创建最大的number堆上对象的数量 不是聚合大小 而是对象的原始数
  • Automapper:映射到受保护的财产

    我需要映射到protected使用类的属性Automapper 我有一个public此类上公开的方法 用于设置属性的值 该方法需要一个parameter 如何将值映射到此类 目的地舱位 public class Policy private
  • Pyspark 性能:dataframe.collect() 非常慢

    当我尝试在数据帧上进行收集时 似乎花费了太长时间 我想从数据框中收集数据 将其转换为字典并将其插入到 documentdb 中 但是执行day rows collect 时性能似乎很慢 day rows self sc sql select
  • 如何使两个数组连续以便 Numba 可以加速 np.dot()

    我有以下代码 import numpy as np from numba import jit Nx 15 Ny 1000 v np ones Nx Ny v np reshape v Nx Ny A np random rand Nx N