python - अवधि गणना के लिए टाइमस्टैंप का फास्ट रूपांतरण



performance python-2.7 (1)

हमारे पास एक लॉग विश्लेषक मिला है जो 100 जीबी के आदेश पर लॉग को पार्स करता है (मेरी टेस्ट फाइल है ~ 20 मिलियन लाइनें, 1.8 जीबी)। यह हम चाहते हैं (आधा दिन के ऊपर) की तुलना में अधिक समय ले रहा है, इसलिए मैंने इसे सीप्रोफाइल के खिलाफ चलाया और> 75% समय स्ट्रेट्टी द्वारा लिया जा रहा है:

       1    0.253    0.253  560.629  560.629 <string>:1(<module>)
20000423  202.508    0.000  352.246    0.000 _strptime.py:299(_strptime)

लॉग प्रविष्टियों के बीच अवधियों की गणना करने के लिए, वर्तमान में:

ltime = datetime.strptime(split_line[time_col].strip(), "%Y-%m-%d %H:%M:%S")
lduration = (ltime - otime).total_seconds()

जहां पिछली रेखा से समय का समय टिकट है

लॉग फ़ाइलों को इन पंक्तियों के साथ स्वरूपित किया गया है:

0000 | 774 | 475      | 2017-03-29 00:06:47 | M      |        63
0001 | 774 | 475      | 2017-03-29 01:09:03 | M      |        63
0000 | 774 | 475      | 2017-03-29 01:19:50 | M      |        63
0001 | 774 | 475      | 2017-03-29 09:42:57 | M      |        63
0000 | 775 | 475      | 2017-03-29 10:24:34 | M      |        63
0001 | 775 | 475      | 2017-03-29 10:33:46 | M      |        63    

परीक्षण फ़ाइल के खिलाफ इसे चलाने के लिए लगभग 10 मिनट लगते हैं

इसके साथ strptime() को बदलना strptime() इस प्रश्न से ):

def to_datetime(d):
    ltime = datetime.datetime(int(d[:4]), 
                              int(d[5:7]), 
                              int(d[8:10]), 
                              int(d[11:13]), 
                              int(d[14:16]), 
                              int(d[17:19]))

वह सिर्फ 3 मिनट से कम समय तक लाता है।

सीपी प्रोफाइल फिर से रिपोर्ट करता है:

       1    0.265    0.265  194.538  194.538 <string>:1(<module>)
20000423   62.688    0.000   62.688    0.000 analyzer.py:88(to_datetime)

यह रूपांतरण अभी भी संपूर्ण विश्लेषक चलाने के लिए एक तिहाई समय लेता है। इन-अस्तर में लगभग 20% तक रूपांतरण के निशान को कम कर दिया जाता है, लेकिन हम अभी भी 25% समय देख रहे हैं कि इन लाइनों को संसाधित करने के लिए टाइमस्टैम्प को datetime प्रारूप में परिवर्तित किया जा रहा है ( total_seconds() साथ total_seconds() उस पर शीर्ष पर और 5% का उपयोग करता है) ।

मैं बस एक कस्टम टाइमस्टैम्प को datetime पूरी तरह से सेकंड तक रूपांतरण के लिए लिख सकता हूं, जब तक कि किसी के पास एक और चमकदार विचार न हो?


तो मैं देख रहा था और मुझे एक मॉड्यूल मिला जो शानदार काम करता है:

परिचय ciso8601 :

from ciso8601 import parse_datetime
...
ltime = parse_datetime(sline[time_col].strip())

जो, सीप्रोफाइल के माध्यम से:

       1    0.254    0.254  123.795  123.795 <string>:1(<module>)
20000423    4.188    0.000    4.188    0.000 {ciso8601.parse_datetime}

जो कि datetime.strptime() माध्यम से सरल दृष्टिकोण से ~ 84x तेज है ... जो आश्चर्य की बात नहीं है, उन्होंने यह करने के लिए सी मॉड्यूल लिखा था





python-2.7