2014-09-02 11 views
46

निम्नलिखित कोड अच्छी तरह से काम करता है। बस जांच रहा है: क्या मैं पांडों का सही उपयोग और समय कर रहा हूं और क्या कोई तेज तरीका है? धन्यवाद।क्या यह पांडस में समूह का सबसे तेज़ तरीका है?

$ python3 
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pandas as pd 
>>> import numpy as np 
>>> import timeit 
>>> pd.__version__ 
'0.14.1' 

def randChar(f, numGrp, N) : 
    things = [f%x for x in range(numGrp)] 
    return [things[x] for x in np.random.choice(numGrp, N)] 

def randFloat(numGrp, N) : 
    things = [round(100*np.random.random(),4) for x in range(numGrp)] 
    return [things[x] for x in np.random.choice(numGrp, N)] 

N=int(1e8) 
K=100 
DF = pd.DataFrame({ 
    'id1' : randChar("id%03d", K, N),  # large groups (char) 
    'id2' : randChar("id%03d", K, N),  # large groups (char) 
    'id3' : randChar("id%010d", N//K, N), # small groups (char) 
    'id4' : np.random.choice(K, N),   # large groups (int) 
    'id5' : np.random.choice(K, N),   # large groups (int) 
    'id6' : np.random.choice(N//K, N),  # small groups (int)    
    'v1' : np.random.choice(5, N),   # int in range [1,5] 
    'v2' : np.random.choice(5, N),   # int in range [1,5] 
    'v3' : randFloat(100,N)    # numeric e.g. 23.5749 
}) 

अब समय 5 अलग-अलग समूह, समय की पुष्टि करने के लिए प्रत्येक को दो बार दोहराते हैं। [मुझे लगता है कि timeit(2) इसे दो बार चलाता है, लेकिन फिर यह कुल रिपोर्ट करता है। मुझे पहले और दूसरे रन के समय में अलग-अलग दिलचस्पी है।] इन परीक्षणों के दौरान htop के अनुसार पायथन लगभग 10 जी रैम का उपयोग करता है।

How to solve memory error in mtrand.RandomState.choice?:

$ lscpu 
Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    32 
On-line CPU(s) list: 0-31 
Thread(s) per core: 2 
Core(s) per socket: 8 
Socket(s):    2 
NUMA node(s):   2 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     62 
Stepping:    4 
CPU MHz:    2500.048 
BogoMIPS:    5066.38 
Hypervisor vendor:  Xen 
Virtualization type: full 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    25600K 
NUMA node0 CPU(s):  0-7,16-23 
NUMA node1 CPU(s):  8-15,24-31 

$ free -h 
      total  used  free  shared buffers  cached 
Mem:   240G  74G  166G  372K  33M  550M 
-/+ buffers/cache:  73G  166G 
Swap:   0B   0B   0B 

मैं इसे प्रासंगिक लेकिन सिर्फ मामले में है विश्वास नहीं है, ऊपर randChar समारोह mtrand.RandomState.choice में एक स्मृति त्रुटि के लिए एक समाधान नहीं है:

>>> timeit.Timer("DF.groupby(['id1']).agg({'v1':'sum'})"       ,"from __main__ import DF").timeit(1) 
5.604133386000285 
>>> timeit.Timer("DF.groupby(['id1']).agg({'v1':'sum'})"       ,"from __main__ import DF").timeit(1) 
5.505057081000359 

>>> timeit.Timer("DF.groupby(['id1','id2']).agg({'v1':'sum'})"      ,"from __main__ import DF").timeit(1) 
14.232032927000091 
>>> timeit.Timer("DF.groupby(['id1','id2']).agg({'v1':'sum'})"      ,"from __main__ import DF").timeit(1) 
14.242601240999647 

>>> timeit.Timer("DF.groupby(['id3']).agg({'v1':'sum', 'v3':'mean'})"    ,"from __main__ import DF").timeit(1) 
22.87025260900009 
>>> timeit.Timer("DF.groupby(['id3']).agg({'v1':'sum', 'v3':'mean'})"    ,"from __main__ import DF").timeit(1) 
22.393589012999655 

>>> timeit.Timer("DF.groupby(['id4']).agg({'v1':'mean', 'v2':'mean', 'v3':'mean'})" ,"from __main__ import DF").timeit(1) 
2.9725865330001398 
>>> timeit.Timer("DF.groupby(['id4']).agg({'v1':'mean', 'v2':'mean', 'v3':'mean'})" ,"from __main__ import DF").timeit(1) 
2.9683854739996605 

>>> timeit.Timer("DF.groupby(['id6']).agg({'v1':'sum', 'v2':'sum', 'v3':'sum'})" ,"from __main__ import DF").timeit(1) 
12.776488024999708 
>>> timeit.Timer("DF.groupby(['id6']).agg({'v1':'sum', 'v2':'sum', 'v3':'sum'})" ,"from __main__ import DF").timeit(1) 
13.558292575999076 

यहाँ प्रणाली की जानकारी है

+4

'df.groupby' बहुत अच्छी तरह अनुकूलित है। आप किस विकल्प पर विचार कर रहे हैं? एकमात्र चीज जिसे मैं सोच सकता हूं वह 'आईडी' कॉलम को इंडेक्स के रूप में सेट करना है और फिर 'df.groupby (level = id_whatever)' का उपयोग करना है। –

+0

@PaulH धन्यवाद मैं सूचकांक के रूप में 'id' कॉलम आज़माउंगा। मैं आर के 'data.table' (जो मैं रखता हूं) की तुलना कर रहा हूं। –

+0

ओह ठंडा। दूसरी बात यह है कि मैं इसका उल्लेख करूंगा कि यह एक आईपीथन नोटबुक में कर रहा है और 'टाइमिट' जादू का उपयोग करके शायद आपकी कुछ स्वच्छता बनाए रखेगा। http://nbviewer.ipython.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb#- कुछ- सिंपल-सेल- मैगिक्स –

उत्तर

4

यदि आप iPython खोल स्थापित करना चाहते हैं, तो आप% timeit का उपयोग करके आसानी से अपना कोड टाइम कर सकते हैं। इसे स्थापित करने के बाद, पाइथन दुभाषिया लॉन्च करने के लिए python टाइप करने के बजाय, आप ipython टाइप करेंगे।

फिर आप अपना कोड ठीक उसी प्रकार टाइप कर सकते हैं जैसे आप इसे सामान्य दुभाषिया (जैसा आपने ऊपर किया था) में टाइप करेंगे।

तो फिर तुम उदाहरण के लिए, लिख सकते हैं:

%timeit DF.groupby(['id1']).agg({'v1':'sum'}) 

यह आपको क्या किया है के रूप में वास्तव में इसी कार्य को पूरा होगा, लेकिन आप अजगर एक बहुत उपयोग कर रहे हैं मुझे लगता है कि यह आप महत्वपूर्ण बचत होगी टाइपिंग समय :)।

IPython अन्य अच्छा सुविधाओं की एक बहुत कुछ (जैसे %paste, जो मैं एक स्क्रिप्ट आप एक फ़ाइल में सहेज कर रखे चलाने के लिए अपने कोड में पेस्ट करें और यह परीक्षण, या %run करते थे) आदि, टैब पूरा होने, http://ipython.org/ है

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