2017-06-22 13 views
5

मैं एसक्यूएल का उपयोग करने के लिए पांडस बनाम किसी को कब उपयोग करना चाहिए, इस पर विभिन्न विचार सुन रहा हूं।पांडस बनाम एसक्यूएल स्पीड

मैं डेटा के 19,150,869 पंक्तियों पर पांडा में निम्नलिखित करने की कोशिश की:

for idx, row in df.iterrows(): 
    tmp = int((int(row['M'])/PeriodGranularity))+1 
    row['TimeSlot'] = str(row["D"]+1) + "-" + str(row["H"]) + "-" + str(tmp) 

और पाया यह इतना ले रहा था तक मैं 20 मिनट के बाद निरस्त करने के लिए किया था।

मैं SQLLite में निम्नलिखित प्रदर्शन:

Select strftime('%w',PlayedTimestamp)+1 as D,strftime('%H',PlayedTimestamp) as H,strftime('%M',PlayedTimestamp) as M,cast(strftime('%M',PlayedTimestamp)/15+1 as int) as TimeSlot from tblMain 

और पाया यह 4 सेकंड लिया ("19,150,869 पंक्तियों 2445ms में लौट आए")।

नोट: पांडा कोड मैं चरण में इस भाग गया इससे पहले कि यह db से डेटा प्राप्त करने के लिए: गलती यहाँ पर है या यह आम तौर पर कुछ के लिए स्वीकार किया जाता है कि कि

sqlStr = "Select strftime('%w',PlayedTimestamp)+1 as D,strftime('%H',PlayedTimestamp) as H,strftime('%M',PlayedTimestamp) as M from tblMain" 
df = pd.read_sql_query(sqlStr, con) 

यह मेरे कोडिंग है कार्य एसक्यूएल बहुत तेज है?

+0

iterrows वास्तव में खराब विकल्प है, पांडा में सबसे धीमी गति से लूपिंग ... – jezrael

+0

धन्यवाद हाँ - मुझे यह पता चलता है कि यह तीर से बहुत तेज़ हो गया है। – user1761806

उत्तर

3

ऐसा लगता है आप vectorize समाधान का उपयोग कर सकते हैं (PeriodGranularity कुछ चर रहा है):

df['TimeSlot'] = (df["D"]+1).astype(str) + "-" + 
        df["H"].astype(str) + "-" + 
       ((df['M'].astype(int)/PeriodGranularity).astype(int)+1).astype(str) 

और पार्स datetimestr लिए उपयोग strftime के लिए।

DataFrame.iterrows वास्तव में धीमा है - this देखें।

पहले कुछ comaprison of code for suers coming from SQL background

कॉमप्रिंग 2 तकनीकें वास्तव में कठिन हैं और मुझे यकीन नहीं है कि SO (बहुत व्यापक कारण) में कुछ अच्छा जवाब है, लेकिन मुझे this मिल गया है।

+0

त्वरित प्रतिक्रियाओं के लिए धन्यवाद, सराहना की। इसे एक भंवर दे रहा है। Ps। लगता है कि आप लिखने के लिए मतलब है। अंत में गंदा (str)? – user1761806

+0

मैं इसे जोड़ता हूं क्योंकि 'str (tmp) ' – jezrael

+0

ठीक है परिणाम, उपरोक्त विधि में 90 सेकंड लग गए। निश्चित रूप से एक सुधार लेकिन SQLLite के लिए 3 सेकंड जितना तेज़ नहीं। मैंने उस समय के दौरान अपने मेमोरी उपयोग की भी जांच की और यह लगभग 65% तक पहुंच गया। वैसे भी एक रूप बनाने के लिए मेरी मदद करने के लिए एक दिलचस्प थोड़ा अभ्यास था। अगर लोगों के पास यह विकल्प है तो बेंचमार्क करने के लिए खुश हैं, लेकिन आम तौर पर मैं इस कार्य के लिए एसक्यूएलएलआईटी की ओर झुका रहा हूं। – user1761806

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