[PYTHON] Mir wurde klar, dass es Unsinn ist, es ohne nachzudenken zu verwenden, weil das Modul praktisch ist

Einführung


Derzeit analysiere ich Apache-Protokolle in meiner Forschung. Ich habe ein Modul namens Apache-Log-Parser verwendet, aber plötzlich habe ich mich gefragt, ob ich dieses Modul verwenden muss, und es nachgeschlagen. Was ist schneller, die Methode mit dem regulären Ausdruck oder die Methode mit dem Modul nach dem Parsen der IP-Adresse? ?? darüber.

Ziel


Es ist ein Protokoll für einen Tag (ca. 45 MB, 184087 Zeilen). Dieses Mal wird nur die IP-Adresse angezeigt.

Reguläre Ausdrücke


Die erste ist die Methode des regulären Ausdrucks.

sample_regex.py


# coding:utf-8
#Ein Programm, das überprüft, was schneller ist, IP-Adressensuche mit regulären Ausdrücken oder Modulen

import time
import sys
import re

if __name__ == "__main__":
    start = time.time()
    argvs = sys.argv
    f = open("~/apache_log_analysis/log_data/" + argvs[1])

    re_ip_addr = re.compile("((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))")

    for line in f.readlines():
        try:
            ip_addr = re_ip_addr.search(line)
            if ip_addr.group() is not None:
                print ip_addr.group()
        except:
            print "logfiled turned over"

    f.close()
    elapsed_time = time.time() - start
    print ("elapsed_time:{0}".format(elapsed_time)) + "[sec]"
    print "exit"

Das Ergebnis war 2.10073304176 [Sek.]! Nach mehrmaligem Ausführen scheinen etwa 0,9 [Sek.] Am schnellsten zu sein, und 0,9 [Sek.] Wurden in den meisten Ausführungsergebnissen gemessen.

Modulverwendung


Als nächstes folgt die Methode mit Modulen.

sample_module.py


# coding:utf-8
#Ein Programm, das überprüft, was schneller ist, IP-Adressensuche mit regulären Ausdrücken oder Modulen

import time
import sys
import apache_log_parser

if __name__ == "__main__":
    start = time.time()
    argvs = sys.argv
    f = open("~/apache_log_analysis/log_data/" + argvs[1])

    parser = apache_log_parser.make_parser('%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"')

    for line in f.readlines():
        try:
            log_data = parser(line)
            print log_data['remote_host']
        except:
            print "logfiled turned over"

    f.close()
    elapsed_time = time.time() - start
    print ("elapsed_time:{0}".format(elapsed_time)) + "[sec]"
    print "exit"

Das Ergebnis war 78.4286789894 [Sek.]! Ich habe viele Male nachgesehen, ob ich einen Fehler im Programm gemacht habe, weil es zu spät war, und ich habe mich gefragt, was es war.

abschließend


Wenn Sie darüber nachdenken, war dies ein natürliches Ergebnis, da verschiedene andere Informationen analysiert würden, wenn Sie das Modul verwenden würden. Trotzdem war ich überrascht, weil es zu spät war. Als ich mir die Quelle des Moduls ansah, wurde es so gemacht, dass es weit verbreitet sein kann, also fühlte es sich so an.

In Zukunft dachte ich, es wäre besser, sich nicht zu sehr auf das Modul zu verlassen, sondern es aus der Quelle des Moduls zu ziehen und nur den erforderlichen Teil zu verwenden, wenn es schneller ist, es selbst zu implementieren.

Ich habe gelernt, dass es praktisch ist, aber man kann sich nicht zu sehr darauf verlassen. ..

Recommended Posts

Mir wurde klar, dass es Unsinn ist, es ohne nachzudenken zu verwenden, weil das Modul praktisch ist
[Einführung in Mac] Praktische Mac-Apps und -Einstellungen, die ich verwende
Ich möchte nicht nach High Para suchen, da es sich um IQ1 handelt (wie man lightgbm_tuner verwendet).
Verwendung des optparse-Moduls
Wenn ich versuche, pip zu verwenden, ist das SSL-Modul nicht verfügbar.
Verwendung des ConfigParser-Moduls
Ich habe versucht herauszufinden, was ich tun kann, weil das Schneiden bequem ist
Bequem zum Verwenden von Ebenen beim Laden von Bibliotheken auf Lambda
Wird nicht empfohlen, pip direkt zu verwenden?
Ich wollte das Suchmodul von Ansible2 verwenden, aber es hat einige Zeit gedauert, machen Sie sich also eine Notiz
Der tree.plot_tree von scikit-learn war sehr einfach und bequem, daher habe ich versucht, zusammenzufassen, wie man es einfach benutzt.
Ich dachte, es wäre langsam, die for-Anweisung in NumPy zu verwenden, aber das war nicht der Fall.
Der durch Chillen erstellte Übersetzungsbefehl (TUI) ist zu bequem, verwenden Sie ihn also!
Python Ich weiß nicht, wie ich den Druckernamen bekomme, den ich normalerweise benutze.
Ich habe versucht, mein eigenes Modul zu veröffentlichen, damit ich es per Pip installieren kann
Es ist bequemer, csv-table zu verwenden, wenn Sie eine Tabelle mit Python-Sphinx schreiben
Erstellen eines Python-Tools zur Dokumentgenerierung, da die Verwendung von Sphinx schwierig ist
Ich habe versucht, den Urknall-Satz zu verifizieren [Kommt er zurück?]
Hackasons Erfahrung, dass es am wichtigsten ist, die Gefühle des Veranstalters zu verstehen
Ich habe versucht, OneHotEncoder zu erstellen, der häufig für die Datenanalyse verwendet wird, damit er den juckenden Ort erreicht.
Ich möchte die Aktivierungsfunktion Mish verwenden
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Der Befehl zum Generieren des RFC-Bibtex ist praktisch. Geben Sie ihn daher an alle X-Schüler weiter
So lösen Sie das Problem, dass der Anmeldebildschirm unter Ubuntu 19.04 nicht für immer angezeigt wird, da er beim Start beim Logo stoppt
Verwendung von Raspeye Relay Module Python
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Ich möchte sagen, dass es eine Datenvorverarbeitung gibt ~
Ich möchte R-Datensatz mit Python verwenden
Das Geräusch von Mr. Tick am Arbeitsplatz ist ... Ich habe es mit dem Code geschafft
Erstellt ein Tool, mit dem Sie bequem Parameter für Modelle des maschinellen Lernens festlegen können
Verwenden Sie den Befehl pushd, der bequemer als der Befehl cd ist, um sofort zum ursprünglichen Verzeichnis zurückzukehren.
[Python] Was ist ein Tupel? Erklärt, wie man es benutzt und wie man es benutzt, ohne zu tippen.
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
[Python] Der Status jeder Präfektur des neuen Koronavirus wird nur als PDF veröffentlicht, aber ich habe versucht, ihn zu kratzen, ohne ihn herunterzuladen.
Die Geschichte, als ich von Caused by SSLError abhängig war ("Kann keine Verbindung zur HTTPS-URL herstellen, da das SSL-Modul nicht verfügbar ist.")