我試用了xtensor-python,並且在使用cookiecutter setup並啓用了SIMD內在函數xsimd後,開始編寫一個非常簡單的求和函數。Xtensor類型與NumPy簡單還原的性能
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))
這(可能有缺陷的)基準似乎表明用於降低對於較大的陣列此基本功能xtensor的該性能相比於NumPy的。
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
非常酷,感謝您的信息和您的項目工作!如果我還有其他問題,我一定會問。 –