2017-11-11 971 views
1

我試用了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 

benchfig

爲什麼我看到這個任何想法?我猜這是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 

回答

3

哇,這是一個巧合!我正在研究這個加速!

xtensor的總和是一個懶惰的操作 - 它不使用最高性能的迭代順序來進行(自動)矢量化。但是,我們剛剛添加了evaluation_strategy參數以減少(以及即將到來的累計),從而允許您在immediatelazy之間進行選擇。

即時減少立即執行減少(而不是延遲),並且可以使用針對向量化減少而優化的迭代順序。

你可以找到在這個PR此功能:https://github.com/QuantStack/xtensor/pull/550

在我的基準,這應該是至少一樣快或比numpy的更快。 我希望今天能融合它。

Btw。請不要猶豫,放棄我們的gitter頻道併發佈一個問題鏈接,我們需要更好地監控StackOverflow:https://gitter.im/QuantStack/Lobby

+0

非常酷,感謝您的信息和您的項目工作!如果我還有其他問題,我一定會問。 –