2013-03-13 68 views
7

我有很長的計算,我重複了很多次。因此,我想使用memoization(包如jugjoblib),與Pandas一致。問題是軟件包是否會將Pandas DataFrames記憶爲方法參數。熊貓記憶

有人試過嗎?有沒有其他建議的軟件包/方法來做到這一點?

回答

6

壺的作者在這裏:壺工作正常。我剛剛試過以下,它的工作原理:

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()) 

這是效率不高,因爲它可能是因爲它只是使用pickle內部的DataFrame(雖然它壓縮它的飛行,所以在用詞不可怕的內存使用,只是比它可能慢)。

我將開放其保存這些作爲作爲壺目前確實爲numpy的陣列的特殊情況的變化:https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102

+0

當你調用compute(gendata())時會發生什麼?它實際上是否從緩存加載DataFrame? – Yariv 2013-03-21 11:32:05

+0

如果' gendata()''是在不同的進程中計算出來的,然後是的。 – luispedro 2013-03-21 11:35:25

+0

有沒有辦法用'python'命令而不是'jug'運行jug? – Light 2017-02-13 07:35:48

4

我使用這個基本的memoization裝飾,memoizedhttp://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]))'返回一個不同的值,如果你調用它兩次。 – Yariv 2013-03-16 17:43:04

+0

在嘗試緩存數據之前,通過memoized檢查集合的可用代碼.Hashable()。但是你的評論讓我重新考慮這是否按預期工作。 – 2013-03-18 14:44:45

+0

DataFrame可能應該在這種情況下提出,我會在github上提出 – 2013-06-07 21:26:54