我正在尝试xtensor-python并在使用cookiecutter setup并使用xsimd启用SIMD内在函数后编写一个非常简单的求和函数。
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.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性能下降。
numpy 1.13.3
openblas 0.2.20
python 3.6.3
xtensor 0.12.1
xtensor-python 0.14.0
知道为什么我会看到这个吗?我猜它是NumPy使用的东西xtensor没有(但是),但我不确定它可以用于简化这样简单。我挖掘了xmath.hpp,但没有看到任何明显的东西,文档中没有提到这样的内容。
版本
navParams
答案 0 :(得分:4)
xtensor的和是一个惰性操作 - 并且它不使用最高性能的迭代顺序进行(自动)矢量化。但是,我们刚刚为减少(以及即将到来的累积)添加了evaluation_strategy
参数,您可以在immediate
和lazy
缩减之间进行选择。
立即缩减立即执行缩减(而不是延迟),并且可以使用针对矢量化缩减优化的迭代顺序。
您可以在此PR中找到此功能:https://github.com/QuantStack/xtensor/pull/550
在我的基准测试中,这应该至少与numpy一样快或快。 我希望今天能合并它。
顺便说一下。请不要犹豫,放弃我们的gitter频道并发布问题的链接,我们需要更好地监控StackOverflow:https://gitter.im/QuantStack/Lobby