xtensor类型与NumPy在简单缩减方面的性能比较

4

我尝试使用xtensor-python,并从编写一个非常简单的求和函数开始。在使用cookiecutter设置并启用SIMD指令集后,我开始了这个过程,并借助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)();
}

我使用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

benchfig

你知道为什么我会看到这个吗? 我猜这是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 
1个回答

6

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

xtensor的sum是一种惰性操作——它并不使用最有效的迭代顺序进行(自动)向量化。然而,我们刚刚在缩减(以及即将到来的累加)中添加了一个evaluation_strategy参数,它允许您选择immediatelazy缩减之间。

Immediate缩减会立即执行缩减(而不是惰性),并且可以使用为向量化缩减优化的迭代顺序。

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

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

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


1
非常酷,感谢您提供的信息和在项目上的工作!如果我有进一步的问题,我一定会在那里询问。 - Eric Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接