在使用cookiecutter 设置并使用xsimd启用 SIMD 内在函数之后,我正在尝试xtensor-python并开始编写一个非常简单的 sum 函数。
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 模块,然后在由不同大小构造的 NumPy 数组上测试求和函数np.random.randn
,与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