2013-03-13 5 views
7

私は何度も何度も繰り返す長い計算をしています。したがって、私はと協力してメモ化(jugjoblibのようなパッケージ)を使いたいと思います。問題は、パッケージがメソッド引数としてPandas DataFramesをよくメモするかどうかです。パンダのメモ

誰でも試しましたか?これを行うための他の推奨パッケージ/方法はありますか?

答えて

6

ここにjugの作者:jugはうまくいきます。私は次のことを試してみました、それが動作します:

from jug import TaskGenerator 
import pandas as pd 
import numpy as np 


@TaskGenerator 
def gendata(): 
    return pd.DataFrame(np.arange(343440).reshape((10,-1))) 

@TaskGenerator 
def compute(x): 
    return x.mean() 

y = compute(gendata()) 

それはその場でそれを圧縮が、(それだけDataFrameのために内部pickleを使用してそれができるほど効率的ではないので、それは面で恐ろしいではありませんメモリ使用量はそれよりも少し遅い)。

私は水差しは現在、numpyの配列の場合と同様に、特殊なケースとして、これらを節約変化にオープンになります:https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102

+0

'' compute(gendata()) 'を呼び出すとどうなりますか?実際にキャッシュからDataFrameをロードしていますか? – Yariv

+0

''もし、 '' __hash__''を ' gendata() ''が別のプロセスで計算された場合はyesとなります – luispedro

+0

'jug'ではなく' python'コマンドでjugを実行する方法はありますか? – Light

4

私はこの基本的なメモデコレータ、memoizedを使用します。 http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

DataFramesはハッシュ可能なので、正常に動作するはずです。ここに例があります。

In [2]: func = lambda df: df.apply(np.fft.fft) 

In [3]: memoized_func = memoized(func) 

In [4]: df = DataFrame(np.random.randn(1000, 1000)) 

In [5]: %timeit func(df) 
10 loops, best of 3: 124 ms per loop 

In [9]: %timeit memoized_func(df) 
1000000 loops, best of 3: 1.46 us per loop 

私によく見えます。

+0

感謝。 「DataFramesはハッシュ可能です」とはどういう意味ですか? 'hash(pd.DataFrame([1,2,3]))'は、2回呼び出すと別の値を返します。 – Yariv

+0

memoizedのコードは、データをキャッシュしようとする前にcollections.Hashable()をチェックします。しかし、あなたのコメントは、これが意図したとおりに機能するかどうか再考させています。 –

+0

DataFrameはこのケースではおそらく起きるはずですが、私はgithubにprを載せます –