xtensor 类型与 NumPy 简单归约的性能对比

2023-12-30

我正在尝试xtensor-python https://github.com/QuantStack/xtensor-python并开始编写一个非常简单的求和函数,之后使用千篇一律的设置 https://github.com/QuantStack/xtensor-python-cookiecutter并启用 SIMD 内在函数xsimd https://github.com/QuantStack/xsimd.

inline double sum_pytensor(xt::pytensor<double, 1> &m)
{
  return xt::sum(m)();
}
inline double sum_pyarray(xt::pyarray<double> &m)
{
  return xt::sum(m)();
}

Used setup.py构建我的 Python 模块,然后在由以下代码构建的 NumPy 数组上测试求和函数np.random.randn不同尺寸,比较np.sum.

import timeit

def time_each(func_names, sizes):
    setup = f'''
import numpy; import xtensor_basics
arr = numpy.random.randn({sizes})
    '''
    tim = lambda func: min(timeit.Timer(f'{func}(arr)',
                                        setup=setup).repeat(7, 100))
    return [tim(func) for func in func_names]

from functools import partial

sizes = [10 ** i for i in range(9)]
funcs = ['numpy.sum',
         'xtensor_basics.sum_pyarray',
         'xtensor_basics.sum_pytensor']
sum_timer = partial(time_each, funcs)
times = list(map(sum_timer, sizes))

这个(可能有缺陷的)基准测试似乎表明,与 NumPy 相比,对于较大的数组,该基本函数的 xtensor 的性能会下降。

           numpy.sum  xtensor_basics.sum_pyarray  xtensor_basics.sum_pytensor
1           0.000268                    0.000039                     0.000039
10          0.000258                    0.000040                     0.000039
100         0.000247                    0.000048                     0.000049
1000        0.000288                    0.000167                     0.000164
10000       0.000568                    0.001353                     0.001341
100000      0.003087                    0.013033                     0.013038
1000000     0.045171                    0.132150                     0.132174
10000000    0.434112                    1.313274                     1.313434
100000000   4.180580                   13.129517                    13.129058

知道为什么我会看到这个吗?我猜这是 NumPy 使用的东西,而 xtensor 还没有,但我不确定它可以用于像这样简单的减少。我挖通了xmath.hpp https://github.com/QuantStack/xtensor/blob/master/include/xtensor/xmath.hpp但没有看到任何明显的东西,并且文档中没有引用任何类似的内容。


Versions

numpy                          1.13.3
openblas                       0.2.20
python                         3.6.3
xtensor                        0.12.1
xtensor-python                 0.14.0 

哇,这真是巧合!我正在努力实现这个加速!

xtensor 的 sum 是一个惰性操作——它不使用最高效的迭代顺序进行(自动)向量化。然而,我们刚刚添加了一个evaluation_strategy减少(以及即将到来的累积)的参数,允许您选择immediate and lazy减少。

立即减少立即执行减少(而不是惰性),并且可以使用针对矢量化减少优化的迭代顺序。

您可以在此 PR 中找到此功能:https://github.com/QuantStack/xtensor/pull/550 https://github.com/QuantStack/xtensor/pull/550

在我的基准测试中,这应该至少与 numpy 一样快或更快。 我希望今天能把它合并起来。

顺便提一句。请随时访问我们的 gitter 频道并发布问题链接,我们需要更好地监控 StackOverflow:https://gitter.im/QuantStack/大厅 https://gitter.im/QuantStack/Lobby

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

xtensor 类型与 NumPy 简单归约的性能对比 的相关文章

随机推荐

  • mongo dbname --eval 'db.collection.find()' 不起作用

    为什么这有效 mongo dbname MongoDB shell version 1 8 3 connecting to nextmuni staging gt db collection find foo bar gt bye 虽然这不
  • --disable-web-security 在 Chrome 中工作吗?

    我正在尝试做一个简单的测试 而不更改任何涉及的服务器端代码跨域 https developer mozilla org en US docs Web HTTP CORS AJAX调用 https www w3schools com xml
  • 如何使用cached_network_image预加载图像?

    我刚刚实现了 Flutter包cached network image我想知道如何预加载图像 以便稍后可以立即使用它们 我从我们的服务器检索稍后将使用的所有图像网址 我已经定义了自定义缓存管理器 getter class LocalCach
  • 如何在 Linux 中针对分段错误生成核心转储?

    我的 Linux 中有一个进程出现分段错误 我怎样才能告诉它在失败时生成核心转储 这取决于您使用的 shell 如果您使用的是 bash 则 ulimit 命令控制与程序执行相关的多个设置 例如是否应该转储核心 如果您输入 ulimit c
  • 仅当属性为 null 时,如何从 lombok 构建器中排除该属性

    我有一个用户模型类 如下所示 JsonSerialize Getter Setter FieldDefaults level AccessLevel PRIVATE Builder public class User Default Str
  • 基于 Python 中较小的数据集生成较大的综合数据集

    我有一个包含 21000 行 数据样本 和 102 列 特征 的数据集 我希望根据当前数据集生成一个更大的合成数据集 例如 100000 行 这样我就可以将其用于机器学习目的 我在这篇文章中提到了 Prashant 的答案https sta
  • 替换“/”之前的任何字符串,PHP

    我想替换 之前的任何字符串 无论字符串长度如何 谢谢 让 一种方式 假设您想更改第一个 之前的字符串 str anystring the rest blah s explode str s 0 new string print r impl
  • 谷歌浏览器本地存储保存在哪里?

    某些网站显示正在使用本地存储 在 Google Chrome 中 CTRL I 资源选项卡 本地存储 例如 StackOverflow 有一个 login prefs 键和我的默认登录提供程序 所以据我所知它是一个 json 对象 这些数据
  • Spring embeddeb 数据库表已存在错误

    我正在尝试使用嵌入式数据库运行 Spring Boot 应用程序 在 bean 初始化期间 由于某种原因 我的表创建脚本被调用两次 第二次调用失败 并出现 表已存在 错误 下面是我的代码 可能是什么问题 Configuration publ
  • MatLab - 将函数应用于矩阵中的每一行

    我有一个矩阵 行数为 4 个整数 列数未指定 取决于文本文件 我想独立地将函数应用于矩阵的每一行 该函数有 4 个输入和 2 个输出 我尝试使用 arrayfun 函数来执行此操作 但每当我调用该函数时 都会收到一条错误消息 输入参数不足
  • 如何在木偶上使用参数化正则表达式(例如/${user}/)进行测试?

    我需要获取用户的主目录 我决定通过解析 getent passwd 字符串来获取它 这是一个自定义事实构建为 内容的串联 etc passwd 并借助正则表达式提取相关信息 当我测试 getent带有固定字符串 adam 提取工程 if g
  • 如何在C#中使用Either类型?

    佐兰 霍瓦特 https www pluralsight com authors zoran horvat提议使用Either类型以避免空检查和不要忘记处理问题在执行操作期间 Either在函数式编程中很常见 为了说明其用法 Zoran 展
  • 如何对“新风格”Django 中间件进行单元测试

    我正在学习如何对 Django 中间件进行单元测试 在 旧式 中间件中 使用以下命令加载中间件非常容易process request 测试结果 例如 def test session self request self factory ge
  • 衍生品警告没有意义

    我收到以下形式的警告 DerivativesWarning Constraints or objectives traj linkages stage 1 grav turn alpha final coast 1 alpha initia
  • 错误显示:dyld_sim 与加载的进程不兼容

    我有一个 iPhone 中运行的应用程序的源代码 适用于 iOS 7 及之前的操作系统 但 iOS 8 0 及更高版本不支持该应用程序 当我尝试编译代码时 它可以正常执行所有文件 但会引发体系结构不匹配错误 在控制台中 dyld dyld
  • 如何更改查询以仅保留叶节点

    我有包含以下数据的表 id parent id short name 6 5 cpu 7 5 ram 14 9 tier a 15 9 rfc1918 16 9 tolerant 17 9 nononymous 13 12 cloudsta
  • HTTPServletRequest getParameterMap() 与 getParameterNames

    HTTPServletRequestreq 有一个方法getParameterMap 但是 这些值返回一个String 代替String 对于发布数据为 姓名 玛丽 姓氏 约翰 年龄 20 我在帖子数据中看到它不是一个数组 但是getPar
  • AngularJS 根据用户输入切换样式表

    如何根据用户单击的按钮来切换 切换 AngularJS 页面的样式表 您实际上可以在 html 级别放置一个控制器并修改link标签的href Demo http plnkr co edit jBtP6FfmeRzOYUCnHg3t p p
  • 如何检测通知/系统栏何时打开

    我需要知道系统 通知栏何时在我的应用程序中打开 但我找不到任何真正的解决方案 所以我将一些东西组合在一起 看起来效果很好 在详细介绍实现之前 我将简要解释一下我的 非常老套的 逻辑 当某个 Activity 由于任何原因不再对用户可见时 将
  • xtensor 类型与 NumPy 简单归约的性能对比

    我正在尝试xtensor python https github com QuantStack xtensor python并开始编写一个非常简单的求和函数 之后使用千篇一律的设置 https github com QuantStack x