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
为什么我看到这个任何想法?我猜这是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
参数以减少(以及即将到来的累计),从而允许您在immediate
和lazy
之间进行选择。
即时减少立即执行减少(而不是延迟),并且可以使用针对向量化减少而优化的迭代顺序。
你可以找到在这个PR此功能:https://github.com/QuantStack/xtensor/pull/550
在我的基准,这应该是至少一样快或比numpy的更快。 我希望今天能融合它。
Btw。请不要犹豫,放弃我们的gitter频道并发布一个问题链接,我们需要更好地监控StackOverflow:https://gitter.im/QuantStack/Lobby
非常酷,感谢您的信息和您的项目工作!如果我还有其他问题,我一定会问。 –