2017-01-17 1 views
0

数回適用すると、numpyの行列固有の関数(たとえば、x.max()がバッファリングされますか?numpy-matrix-functionsはバッファされていますか?

だから、1人の書くべき:

bincount=np.apply_along_axis(lambda x: np.bincount(x, minlength=data.max()+1), axis=0, arr=data) 

以上

データは、例えばある
data_max=data.max()+1 
bincount=np.apply_along_axis(lambda x: np.bincount(x, minlength=data_max), axis=0, arr=data) 

は、

data=np.array([[1,2,5,4,8,7,8,9,14,8,14,5,2,1], 
       [5,8,7,13,7,8,9,21,5,7,9,24,3,2]]) 

またはコースのさえもはるかに大きい

+1

一般に、パフォーマンスが懸念される場合はベンチマークを実行し、違いを自分自身で確認することをお勧めします。 –

答えて

2

質問を更新した後、あなたがnumpyのは、その結果のキャッシュのいくつかのフォームを実装しているかどうかを尋ねているようです。この質問には一般的な回答はありませんが、ndarray.maxのような方法では、キャッシングは行われません。

実装を見ていないと、そのことをどのように知ることができますか?キャッシングスキームは、2つの問題を解決しなければならないと考えてください。

  • キャッシュされた結果を格納する場所を見つけます。
  • は、もう適用されなくなった時点でキャッシュを無効にする戦略を持っています。

最初の問題は重要ではありませんが、2番目の問題は本当のキラーです。配列はいつでも変更することができるだけでなく、配列の内容を多くのオブジェクトで共有することができます。さらに、Cコードは内部バッファのアドレスを取得し、内部メモリに独自の変更を実装することができます。結果をキャッシングすると、numpyの多くの興味深い用途が効果的に無効になります。

numpyは、その性質の最適化に関係のない低レベルのライブラリと考えることができます。キャッシュが必要な場合は、2番目の例に示すように、より高いレベルで実装する必要があります。

+0

私はあなたの意見を持って、私は私の質問を明確にします。私の質問は、何度も繰り返してdata.max()が変わらないときにだけ意味があります。 – benni

+0

@benni [OK]を、あなたは実際に*キャッシュ*または*メモ*について話しています。私はそれに応じて答えを更新しました。 – user4815162342

+0

numpyがCコードでアクセスできることを指摘してくれてありがとう。それは私には新しいものでした。 – benni

0

スレーターTyranusは指摘のように、唯一のbenchmakrはどんな結果が表示されます:

import numpy as np 
import timeit 

def func_a(data): 
    return np.apply_along_axis(lambda x: np.bincount(x, minlength=data.max()+1), axis=0, arr=data) 

def func_b(data): 
    data_max=data.max()+1 
    return np.apply_along_axis(lambda x: np.bincount(x, minlength=data_max), axis=0, arr=data) 

setup = '''import numpy as np 
data=np.array([[1,2,5,4,8,7,8,9,14,8,14,5,2,1], 
       [5,8,7,13,7,8,9,21,5,7,9,24,3,2]]) 
from __main__ import func_a, func_b''' 

min(timeit.Timer('func_a(data)', setup=setup).repeat(100,100))

0.02922797203063965

min(timeit.Timer('func_b(data)', setup=setup).repeat(100,100))

0.018524169921875

さらに大きなデータでもテストしました。全体として、前にdata_max=data.max()を計算して返済すると言えます。はるかに大きな配列では、不一致がさらに大きくなります。

関連する問題