【问题标题】:Performance of xtensor types vs. NumPy for simple reductionxtensor 类型的性能与 NumPy 的简单缩减
【发布时间】:2018-04-24 17:15:32
【问题描述】:

在使用cookiecutter setup 并使用xsimd 启用SIMD 内在函数之后,我正在尝试xtensor-python 并开始编写一个非常简单的求和函数。

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)();
}

使用setup.py 构建我的Python 模块,然后在由np.random.randn 构造的不同大小的NumPy 数组上测试求和函数,与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,但没有看到任何明显的东西,文档中也没有提到这样的内容。


版本

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

【问题讨论】:

    标签: python c++ performance numpy xtensor


    【解决方案1】:

    哇,这真是巧合!我正在研究这个加速!

    xtensor 的求和是一种惰性操作——它不使用性能最高的迭代顺序进行(自动)向量化。但是,我们刚刚为减少(以及即将到来的累积)添加了一个evaluation_strategy 参数,它允许您在immediatelazy 减少之间进行选择。

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

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

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

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

    【讨论】:

    • 非常酷,感谢您为项目提供的信息和工作!如果我有任何其他问题,我一定会在那里问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2012-01-17
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多