2013-03-13 2 views
7

У меня есть длительные вычисления, которые я повторяю много раз. Поэтому я хотел бы использовать memoization (пакеты, такие как jug и joblib), совместно с Pandas. Проблема заключается в том, будет ли пакет хорошо запоминать Pandas DataFrames как аргументы метода.Pandas memoization

Кто-нибудь попробовал? Есть ли другой рекомендуемый пакет/способ сделать это?

ответ

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

+0

Если '' gendata() '' вычислялся в другом процессе, тогда да. – luispedro

+0

Есть ли способ запустить кувшин с помощью команды 'python' вместо' jug'? – Light

4

Я использую этот базовый декоратор напоминания, memoized. http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

DataFrames hashable, поэтому он должен работать нормально. Вот пример.

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 hashable»? 'hash (pd.DataFrame ([1,2,3]))' возвращает другое значение, если вы вызываете его дважды. – Yariv

+0

Код для memoized проверок коллекций.Hashable() перед тем, как он пытается кэшировать данные. Но ваш комментарий заставляет меня пересмотреть, работает ли это по назначению. –

+0

DataFrame, вероятно, должен подняться в этом случае, я поставлю pr на github –