xtensor类型与NumPy的简单缩减表现

时间:2017-11-11 16:46:09

标签: python c++ performance numpy xtensor

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

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不同大小的np.sum构建的NumPy数组上测试出求和函数,与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.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性能下降。

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

benchfig

知道为什么我会看到这个吗?我猜它是NumPy使用的东西xtensor没有(但是),但我不确定它可以用于简化这样简单。我挖掘了xmath.hpp,但没有看到任何明显的东西,文档中没有提到这样的内容。

版本

navParams

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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