我正在尝试xtensor-python https://github.com/QuantStack/xtensor-python并开始编写一个非常简单的求和函数,之后使用千篇一律的设置 https://github.com/QuantStack/xtensor-python-cookiecutter并启用 SIMD 内在函数xsimd https://github.com/QuantStack/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)();
}
Used 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 https://github.com/QuantStack/xtensor/blob/master/include/xtensor/xmath.hpp但没有看到任何明显的东西,并且文档中没有引用任何类似的内容。
Versions
numpy 1.13.3
openblas 0.2.20
python 3.6.3
xtensor 0.12.1
xtensor-python 0.14.0