numpy around/rint 与 astype(int) 相比慢

2023-11-24

所以如果我有类似的东西x=np.random.rand(60000)*400-200。 iPython 的%timeit says:

  • x.astype(int)需要 0.14 毫秒
  • np.rint(x) and np.around(x)需要1.01ms

请注意,在rint and around情况下你仍然需要花费额外的0.14ms来完成最后的astype(int)(假设这就是您最终想要的)。

问题:我的想法是否正确,大多数现代硬件都能够同时执行这两项操作?如果是这样,为什么 numpy 的舍入时间要长 8 倍?

碰巧我对算术的准确性并不是非常挑剔,但我不知道如何利用 numpy 来利用这一点(我正在研究混乱的生物学而不是粒子物理学)。


np.around(x).astype(int) and x.astype(int)不产生相同的值。前几轮均匀(与((x*x>=0+0.5) + (x*x<0-0.5)).astype(int))而后者四舍五入为零。然而,

y = np.trunc(x).astype(int)
z = x.astype(int)

shows y==z但计算y速度要慢得多。所以这是np.truncand np.around缓慢的函数。

In [165]: x.dtype
Out[165]: dtype('float64')
In [168]: y.dtype
Out[168]: dtype('int64')

So np.trunc(x)从 double 到 double 向零舍入。然后astype(int)必须将 double 转换为 int64。

在内部,我不知道 python 或 numpy 在做什么,但我知道如何在 C 中执行此操作。让我们讨论一些硬件。使用 SSE4.1,可以使用以下命令从双精度到双精度进行 round、floor、ceil 和 trunc:

_mm_round_pd(a, 0); //round: round even
_mm_round_pd(a, 1); //floor: round towards minus infinity
_mm_round_pd(a, 2); //ceil:  round towards positive infinity
_mm_round_pd(a, 3); //trunc: round towards zero

但 numpy 也需要支持没有 SSE4.1 的系统,因此它必须在没有 SSE4.1 的情况下以及有 SSE4.1 的情况下构建,然后使用调度程序。

但是,在 AVX512 之前,使用 SSE/AVX 从 double 直接转换为 int64 的效率并不高。然而,仅使用 SSE2 就可以有效地将 double 舍入为 int32:

_mm_cvtpd_epi32(a);  //round double to int32 then expand to int64
_mm_cvttpd_epi32(a); //trunc double to int32 then expand to int64

这些将两个 double 转换为两个 int64。

在您的情况下,这可以正常工作,因为范围肯定在 int32 内。但除非 python 知道 int32 适合的范围,否则它不能假设这一点,因此它必须舍入或截断为 int64,这很慢。另外,无论如何,numpy 都必须构建支持 SSE2 才能做到这一点。

但也许您可以一开始就使用单个浮点数组。在这种情况下你可以这样做:

_mm_cvtps_epi32(a); //round single to int32
_mm_cvttps_epi32(a) //trunc single to int32

这些将四个单数转换为四个 int32。

因此,为了回答您的问题,SSE2 可以有效地从 double 舍入或截断为 int32。 AVX512 将能够有效地从 double 舍入或截断为 int64 以及使用_mm512_cvtpd_epi64(a) or _mm512_cvttpd_epi64(a)。 SSE4.1可以有效地从浮动到浮动或双倍到双倍进行舍入/截断/下限/上限。

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

numpy around/rint 与 astype(int) 相比慢 的相关文章

  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • 使用 NumPy 将非均匀数据从文件读取到数组中

    假设我有一个如下所示的文本文件 33 346 1223 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我

随机推荐

  • 修改TFS流程模板以实现Nuget Package Restore

    我已从 MSBuild 包恢复迁移到自动包恢复 它会在构建开始之前恢复包 http docs nuget org docs workflows migration to automatic package restore 根据这篇文章htt
  • 防止 Fluent NHibernate select n+1

    我有一个相当深的对象图 5 6 个节点 当我遍历它的一部分时 NHProf 告诉我我遇到了 选择 N 1 问题 我确实这样做了 我知道的两个解决方案是 渴望负载的孩子 分解我的对象图 和急切加载 我真的不想做其中任何一个 尽管我可能会在以后
  • 具有两列组合的 SQLite 唯一键

    我试图确保当我运行以下查询时仅运行第一个INSERT INTO会起作用的 我知道我必须做slot UNIQUE 槽可以是 0 5 INTEGER 但这并不意味着该表只能接受 6 个表数据行 对于每个匹配的playerHash 它应该只允许6
  • 如何轻松找到Android类的源代码

    我知道我可以从以下位置访问 android 源代码https android googlesource com 但是如果我只知道包和 android 类的名称 就很难选择正确的 git 存储库 有没有办法找到文件https android
  • 如何使用 yuicompressor-maven-plugin 让 Maven 用缩小的文件构建战争

    所以我正在尝试一些我认为相当简单的事情 我基本上希望 maven 在构建战争之前为我缩小所有 js 和 css 文件 我的插件看起来像这样
  • 访问网页中的网络摄像头

    我正在开发一个网络应用程序 在我的访客注册页面中 我需要访问网络摄像头用于给客人拍照 我拍摄的图像可以存储在指定位置 这将是执行此操作的最佳方式 欢迎使用 java JSP html java 脚本或任何其他方法 回答自己的问题 因为有更好
  • 管理 flutter 的 TextFormField 中的事件

    在 Flutter 项目中 我需要监听 TextFormField 中的输入文本并执行某些操作 特别是当用户在此字段中放置一些字符 例如空格 或请求焦点时 当这种事件发生时 我需要修改filed的值 我知道有一个房产called contr
  • 我如何使用 sklearn DictVectorizer 对列表进行矢量化

    我在 sklearn 文档网站上找到了下一个示例 gt gt gt measurements city Dubai temperature 33 city London temperature 12 city San Fransisco t
  • 使用非格式化文本周围的颜色和变量格式化 console.log

    问题 我编写了一个函数来演示如何以多种方式格式化 Chrome 开发者控制台 console log 消息 然而 我遇到的问题是在左侧打印一个具有配色方案的变量 然后在中间打印一个没有样式的字符串 然后是另一个已设置样式的变量 这是一个图形
  • 使用 String.split() 以引号作为文本分隔符拆分 csv 文件

    我有一个逗号分隔的文件 其中包含许多类似于下面的行 Sachin M Maths Science English Need to improve in these subjects 引号用于转义用于表示多个值的分隔符逗号 现在如何使用逗号分
  • 字符串池创建在Heap的PermGen区或者Object区

    HERE 作者是这么说的 3 在Heap的PermGen区创建字符串池 进行垃圾回收 可以发生在 Perm 空间中 但取决于 JVM 顺便说一下从 JDK 1 7更新 字符串池移至对象所在的堆区 创建的 这样做有什么具体原因吗 我在网上找不
  • 如何使用 appsync 从 DynamoDB 返回 JSON 对象?

    如何从 DynamoDB 获取 JSON 对象响应 我将数据作为 JSON 格式的对象数组存储在数据库中 我有下一个映射模板请求 version 2017 02 28 operation PutItem key userId S conte
  • 创建给定年份中所有日期的向量

    是否有一个简单的 R 习惯用法来获取给定年份中所有日期的序列 除了闰年之外 我可以执行以下操作 dtt lt as Date paste as character year 1 1 sep seq 0 364 显然 我可以添加一行来过滤掉
  • 从 perl 脚本调用 bash 脚本

    我正在尝试 perl 脚本中的代码 需要在 bash 中调用另一个文件 不确定 哪个是最好的方法 我可以直接使用 system 调用它吗 请指导 向我展示示例方法 从我到目前为止所尝试过的 usr bin perl system bash
  • 将所有 POST 数据存储在 SESSION 中

    我有更多来自 POST 的值 超过 20 个 如下所示 name POST name username POST username city POST city mobile POST mobile address POST address
  • 如何检查网页是否存在。 jQuery 和/或 PHP

    我希望能够验证表单以检查网站 网页是否存在 如果它返回 404 错误 那么绝对不应该验证 如果有重定向 我愿意接受建议 有时重定向会转到错误页面或主页 有时会转到您正在寻找的页面 所以我不知道 也许对于重定向 可能会有一个特殊通知 向用户建
  • 圆形/矩形碰撞响应

    所以我不久前建了一点突破克隆 我想稍微升级一下 主要是为了碰撞 当我第一次做到这一点时 我有一个基本的 碰撞 在我的球和砖块之间进行检测 实际上将球视为另一个矩形 但这造成了边缘碰撞的问题 所以我想我会改变它 问题是 我找到了问题的一些答案
  • 检查表是否继承自 PostgreSQL 中的其他表

    在 PostgreSQL 中这些表 CREATE TABLE cities name text population float altitude int in feet CREATE TABLE cities capitals state
  • 在 Angular 的 ng-switch 中使用 html 模板

    我正在制作一个随着用户点击而移动的 交互式菜单 我想知道是否有办法在 ng switch 中包含 html 模板 由于每个 开关 中的所有逻辑都不同 这将导致巨大的 html 文件 div class content div h1 1 h1
  • numpy around/rint 与 astype(int) 相比慢

    所以如果我有类似的东西x np random rand 60000 400 200 iPython 的 timeit says x astype int 需要 0 14 毫秒 np rint x and np around x 需要1 01