Xtensor类型与NumPy简单还原的性能

问题描述:

我试用了xtensor-python,并且在使用cookiecutter setup并启用了SIMD内在函数xsimd后,开始编写一个非常简单的求和函数。Xtensor类型与NumPy简单还原的性能

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)) 

这(可能有缺陷的)基准似乎表明用于降低对于较大的阵列此基本功能xtensor的该性能相比于NumPy的。

  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 

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

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

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

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

在我的基准,这应该是至少一样快或比numpy的更快。 我希望今天能融合它。

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

+0

非常酷,感谢您的信息和您的项目工作!如果我还有其他问题,我一定会问。 –