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.
Es ist ein Protokoll für einen Tag (ca. 45 MB, 184087 Zeilen). Dieses Mal wird nur die IP-Adresse angezeigt.
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.
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.
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. ..