4 次矩阵乘法的 np.einsum 性能

2024-01-28

给定以下 3 个矩阵:

M = np.arange(35 * 37 * 59).reshape([35, 37, 59])
A = np.arange(35 * 51 * 59).reshape([35, 51, 59])
B = np.arange(37 * 51 * 51 * 59).reshape([37, 51, 51, 59])
C = np.arange(59 * 27).reshape([59, 27])

我在用着einsum计算:

D1 = np.einsum('xyf,xtf,ytpf,fr->tpr', M, A, B, C, optimize=True);

但我发现它的性能要差得多:

tmp = np.einsum('xyf,xtf->tfy', A, M, optimize=True)
tmp = np.einsum('ytpf,yft->ftp', B, tmp, optimize=True)
D2 = np.einsum('fr,ftp->tpr', C, tmp, optimize=True)

我不明白为什么。
总的来说,我正在尽力优化这段代码。我读过有关np.tensordot函数,但我似乎无法弄清楚如何将它用于给定的计算。


看起来你偶然发现了一个案例greedy路径给出了非最佳缩放。

>>> path, desc = np.einsum_path('xyf,xtf,ytpf,fr->tpr', M, A, B, C, optimize="greedy");
>>> print(desc)
  Complete contraction:  xyf,xtf,ytpf,fr->tpr
         Naive scaling:  6
     Optimized scaling:  5
      Naive FLOP count:  3.219e+10
  Optimized FLOP count:  4.165e+08
   Theoretical speedup:  77.299
  Largest intermediate:  5.371e+06 elements
--------------------------------------------------------------------------
scaling                  current                                remaining
--------------------------------------------------------------------------
   5              ytpf,xyf->xptf                         xtf,fr,xptf->tpr
   4               xptf,xtf->ptf                              fr,ptf->tpr
   4                 ptf,fr->tpr                                 tpr->tpr

>>> path, desc = np.einsum_path('xyf,xtf,ytpf,fr->tpr', M, A, B, C, optimize="optimal");
>>> print(desc)
  Complete contraction:  xyf,xtf,ytpf,fr->tpr
         Naive scaling:  6
     Optimized scaling:  4
      Naive FLOP count:  3.219e+10
  Optimized FLOP count:  2.744e+07
   Theoretical speedup:  1173.425
  Largest intermediate:  1.535e+05 elements
--------------------------------------------------------------------------
scaling                  current                                remaining
--------------------------------------------------------------------------
   4                xtf,xyf->ytf                         ytpf,fr,ytf->tpr
   4               ytf,ytpf->ptf                              fr,ptf->tpr
   4                 ptf,fr->tpr                                 tpr->tpr

Using np.einsum('xyf,xtf,ytpf,fr->tpr', M, A, B, C, optimize="optimal")应该让你以最佳性能运行。我可以看看这条边,看看贪婪者能否抓住它。

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

4 次矩阵乘法的 np.einsum 性能 的相关文章

随机推荐

  • 密封案例类是一个好习惯吗?

    密封类的主要原因似乎是 这允许编译器在这些类上进行模式匹配时进行穷举搜索 假设我有用于模式匹配的数据类型 玩具示例 sealed trait Statement case class Assign name String value Int
  • withFormik,将函数作为 props 传递

    我正在使用 Formik 构建用户输入表单 我正在使用 withFormik 来处理我的表单 我目前正在我的组件中传递我的handleSubmit 如下所示 export const CreateForm withFormik mapPro
  • 使用请求范围的 bean 函数作为 JSF 中临时呈现按钮的操作

    我在 JSF 中遇到以下基本 也许是愚蠢的 理解问题 有一个 JSF 页面 testPage xhtml
  • Django 启动时只执行一次代码?

    我正在编写一个 Django 中间件类 我只想在启动时执行一次 以初始化一些其他任意代码 我遵循了 sdolan 发布的非常好的解决方案here https stackoverflow com questions 3495964 in dj
  • 如何使用 Jquery 选择表行?

    我试图使用 JQuery 选择表行 但似乎不会触发 selected 事件 我已将代码放在 JSFiddle 上 http jsfiddle net tonymaloney1971 3tevxmps 1 http jsfiddle net
  • CIColor 到 UIColor -> 未为 UIColor UIExtendedSRGBColorSpace 定义 CIColor

    我正在尝试从 rgb hex 色彩空间实现 CIColor 如下所示 let bottomColor UIColor init red 235 255 green 250 255 blue 255 255 alpha 1 0 ciColor
  • 为什么 OrderedDict 不使用 super ?

    我们可以创建一个OrderedCounter简单地通过使用多重继承 gt gt gt from collections import Counter OrderedDict gt gt gt class OrderedCounter Cou
  • Rails 中两个表具有相同的数据?

    我正在尝试在我的视图中创建一个表并在某些条件下填充它 我有两个表 里面都有两列 一列称为event url另一个是gmiurl 里面有gmiurl的表叫做GMITable另一个叫做newevent 基本上我想展示里面的一切GMITable除
  • 设置 selectonemenu 的默认值

    我有一个像这样的选择菜单
  • APC 显示 100% 碎片

    APC http php net manual en book apc php显示 100 碎片 这很糟糕吗 这是否意味着它根本没有帮助 我应该采取哪些途径来改善情况 提前致谢 根据我的经验 是的 我的系统中 APC 显示 100 碎片 并
  • 按下 tkinter 按钮时如何播放声音?

    我正在为 Windows PC 构建一个程序 其中包含很多按钮并且看起来非常简单 所以我想知道 当你按下按钮 使用 tkinter 时 我可以播放声音来让程序活跃一点吗 请记住我正在学习 所以请简单一点 假设您的文件是 WAV from t
  • 实体类型没有定义键

    另一个 实体类型 x 没有定义键 问题 但我已经设置了 Key 属性上的属性所以我有点困惑 这是我的实体和上下文类 namespace DoctorDB Models public class Doctor Key public strin
  • gzip 无法在 Django 中使用 Whitenoise 工作

    我在 Heroku 上部署了一个 Django 网站 使用 Whitenoise 提供静态文件 静态文件工作正常 但根据我用来测试它的各种网站 包括谷歌工具 Gzip 无法工作 这是我的生产设置文件中的代码 DATABASES defaul
  • iPhone:通过蓝牙序列化和发送对象?

    序列化对象并通过蓝牙 或网络连接 发送它的最佳方法是什么 你可以使用gamekit http developer apple com library ios documentation NetworkingInternet Conceptu
  • 绘制从远程服务器下载的图像

    我需要执行以下操作 从服务器下载 PNG 资源 根据状态在该图像上绘制几个具有不同颜色的矩形 在可缩放图像视图中显示该图像 我在使用 Canvas 的 Android 应用程序中有一个工作代码 但我不知道如何使用 Flutter 来做到这一
  • Java中如何让程序等待按钮按下

    现在 我不确定这是否可能 甚至是完成我想要做的事情的最佳方法 但基本上我正在使用一个非常简单的 Swing GUI 创建一个非常简单的模拟程序 每轮模拟结束后 界面上的一些按钮都会启用 供用户进行更改 然后用户可以按 继续 按钮再次开始模拟
  • JPA 继承 - 更改实体类型

    我有两节课 Entity Inheritance strategy InheritanceType SINGLE TABLE DiscriminatorColumn name PERSONTYPE DiscriminatorValue va
  • 草皮遮罩返回没有洞的多边形

    我得到一些奇怪的结果草皮 mask https turfjs org docs mask 这是polygon我正在尝试运行mask 功能 https gist githubusercontent com Stophface 50155878
  • 在参数中运行带引号的命令适用于commands.getoutput(),但不适用于子进程模块

    我正在创建一个 python 程序 它调用许多其他程序和脚本 在 Unix SUNos Linux 上 除了 1 个脚本之外 我在所有地方都使用子进程 我不使用子进程的脚本是一个 perl 脚本 它已被制作成可执行文件 不知何故 它不允许我
  • 4 次矩阵乘法的 np.einsum 性能

    给定以下 3 个矩阵 M np arange 35 37 59 reshape 35 37 59 A np arange 35 51 59 reshape 35 51 59 B np arange 37 51 51 59 reshape 3