2013-03-13 7 views
7

मेरे पास लंबी गणना है जो मैं कई बार दोहराता हूं। इसलिए, मैं ज्ञापन (jug और joblib जैसे संकुल) का उपयोग करना चाहूंगा, Pandas के साथ संगीत कार्यक्रम में। समस्या यह है कि क्या पैकेज विधि तर्क के रूप में अच्छी तरह से पांडस डेटाफ्रेम को याद करेगा।पांडो ज्ञापन

क्या किसी ने इसे आजमाया है? क्या ऐसा करने के लिए कोई अन्य अनुशंसित पैकेज/तरीका है?

उत्तर

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 के लिए हालांकि यह मक्खी पर संपीड़ित करता है का उपयोग करता है (के रूप में यह हो सकता है के रूप में कुशल नहीं है, तो यह संदर्भ में भयानक नहीं है स्मृति उपयोग का; बस इतना धीमा हो सकता है)। https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102

+0

और जब आप 'गणना (gendata())' कहते हैं तो क्या होता है? क्या यह वास्तव में कैश से डेटाफ्रेम लोड करता है? – Yariv

+0

यदि' ' gendata() '' को एक अलग प्रक्रिया में गणना की गई थी, फिर हां। – luispedro

+0

क्या 'jug' के बजाय' python' कमांड के साथ jug चलाने का कोई तरीका है? – Light

4

मैं इस मूल ज्ञापन सजावट, memoized का उपयोग करता हूं। http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

डेटाफ्रेम हैंशबल हैं, इसलिए इसे ठीक काम करना चाहिए। यहां एक उदाहरण दिया गया है।

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

धन्यवाद:

मैं एक परिवर्तन किया है जो एक विशेष मामले के रूप में जग वर्तमान में NumPy सरणी के लिए करता है के रूप में इन बचाता है के लिए खुला होगा। "डेटाफ्रेम हैंशबल" से आपका क्या मतलब है? 'हैश (पीडी। डेटाफ्रेम ([1,2,3])) यदि आप इसे दो बार कहते हैं तो एक अलग मूल्य देता है। – Yariv

+0

डेटा को कैश करने का प्रयास करने से पहले याद किए गए चेक संग्रह के लिए कोड। हैशबल()। लेकिन आपकी टिप्पणी मुझे पुनर्विचार कर रही है कि क्या यह इरादा के रूप में काम करता है। –

+0

डेटाफ्रेम शायद इस मामले में उठाया जाना चाहिए, मैं github –

संबंधित मुद्दे