我尝试使用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
你知道为什么我会看到这个吗? 我猜这是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