在尝试使用xtensor-python并使用cookiecutter setup启用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
相比,对不同大小的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相比,对于较大的阵列,此基本功能的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
最佳答案
哇,这是一个巧合!我正在为此而努力!
xtensor的总和是一个懒惰的操作-并且它不使用性能最高的迭代顺序进行(自动)矢量化。但是,我们只是在还原(和即将到来的累积量)中添加了evaluation_strategy
参数,使您可以在immediate
和lazy
还原之间进行选择。
立即归约立即执行归约(而不是延迟),并且可以使用针对矢量化归约优化的迭代顺序。
您可以在以下PR中找到此功能:https://github.com/QuantStack/xtensor/pull/550
在我的基准测试中,这至少应该比numpy快或快。
我希望今天将其合并。
顺便提一句。请不要犹豫,访问我们的gitter channel 并发布问题的链接,我们需要更好地监视StackOverflow:https://gitter.im/QuantStack/Lobby
关于python - Xtensor类型与NumPy的性能可轻松简化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47240338/