2017-11-11 2 views
1

私はxtensor-pythonを試していましたが、cookiecutter setupを使用し、xsimdでSIMD組み込み関数を有効にした後、非常に単純な合計関数を書いて始めました。私のPythonモジュールをビルドするsetup.pyを使用し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)(); 
} 

、その後、np.sumと比較し、異なるサイズのnp.random.randnから構築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のに比べて、より大きなアレイの劣化この基本的な機能のために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 

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

非常にクール、情報とプロジェクトのあなたの仕事のおかげで!それ以上の質問があれば、私はそこに尋ねます。 –

関連する問題