9

我有很长的计算,我重复了很多次。因此,我想与Pandas一起使用 memoization(例如jugjoblib等包)。问题是这个包是否能很好地记住 Pandas DataFrames 作为方法参数。

有人试过吗?有没有其他推荐的包/方法来做到这一点?

4

2 回答 2

7

这里是水罐的作者:水罐工作正常。我刚刚尝试了以下方法,它可以工作:

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

于 2013-03-20T16:00:02.723 回答
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

在我看来很好。

于 2013-03-14T13:46:12.940 回答