Pandas 备忘录
2 个回答
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
我觉得看起来不错。
7
这里是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())
不过,它的效率没有达到最佳,因为它内部只是使用了pickle
来处理DataFrame
(虽然它在处理时会进行压缩,所以在内存使用上还算可以,只是速度比理想的要慢)。
我愿意考虑一个改进方案,让这些数据像jug目前对待numpy数组那样进行特殊处理:https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102