我有很长的计算,我重复了很多次。因此,我想与Pandas一起使用 memoization(例如jug和joblib等包)。问题是这个包是否能很好地记住 Pandas DataFrames 作为方法参数。
有人试过吗?有没有其他推荐的包/方法来做到这一点?
我有很长的计算,我重复了很多次。因此,我想与Pandas一起使用 memoization(例如jug和joblib等包)。问题是这个包是否能很好地记住 Pandas DataFrames 作为方法参数。
有人试过吗?有没有其他推荐的包/方法来做到这一点?
这里是水罐的作者:水罐工作正常。我刚刚尝试了以下方法,它可以工作:
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
(尽管它会即时压缩它,所以它在内存使用方面并不可怕;只是比它可能的慢)。
我愿意进行更改,将它们保存为特例,就像 jug 目前对 numpy 数组所做的那样:https ://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102
我使用这个基本的记忆装饰器,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
在我看来很好。