[PYTHON] Je me suis rendu compte qu'il était absurde de l'utiliser sans réfléchir car le module est pratique

introduction


Actuellement, j'analyse les logs Apache dans mes recherches. J'utilisais un module appelé apache-log-parser, mais je me suis soudainement demandé si j'avais besoin d'utiliser ce module et je l'ai cherché. Quelle est la plus rapide, la méthode utilisant l'expression régulière ou la méthode utilisant le module après analyse de l'adresse IP? ?? à propos de ça.

Cible


C'est un journal pour une journée (environ 45 Mo, 184087 lignes). Cette fois, seule l'adresse IP est affichée.

Expressions régulières


La première est la méthode d'expression régulière.

sample_regex.py


# coding:utf-8
#Un programme qui vérifie la recherche d'adresse IP la plus rapide à l'aide d'expressions régulières ou de modules

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"

Le résultat était 2.10073304176 [sec]! Après l'avoir fait plusieurs fois, environ 0,9 [sec] semble être le plus rapide, et 0,9 [sec] a été mesuré dans la plupart des résultats d'exécution.

Utilisation du module


Vient ensuite la méthode utilisant des modules.

sample_module.py


# coding:utf-8
#Un programme qui vérifie la recherche d'adresse IP la plus rapide à l'aide d'expressions régulières ou de modules

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"

Le résultat était 78,4286789894 [sec]! J'ai vérifié plusieurs fois pour voir si j'avais fait une erreur dans le programme parce qu'il était trop tard, et je me suis demandé ce que c'était.

en conclusion


Si vous y réfléchissez, c'était un résultat naturel car diverses autres informations seraient analysées si vous utilisiez le module. Même ainsi, j'ai été surpris car il était trop tard. Quand j'ai regardé la source du module, il a été fait pour qu'il puisse être largement utilisé, donc c'était comme si c'était le cas.

À l'avenir, j'ai pensé qu'il valait mieux ne pas trop compter sur le module, mais le tirer de la source du module et n'utiliser que la partie nécessaire s'il est plus rapide de l'implémenter par vous-même.

J'ai appris que c'était pratique, mais on ne peut pas trop s'y fier. ..

Recommended Posts

Je me suis rendu compte qu'il était absurde de l'utiliser sans réfléchir car le module est pratique
[Introduction à Mac] Applications et paramètres Mac pratiques que j'utilise
Je ne veux pas rechercher de para haut parce que c'est IQ1 (comment utiliser lightgbm_tuner)
Comment utiliser le module optparse
Lorsque j'essaye d'utiliser pip, le module SSL n'est pas disponible.
Comment utiliser le module ConfigParser
J'ai essayé de savoir ce que je pouvais faire car le tranchage est pratique
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
N'est-il pas recommandé d'utiliser pip directement?
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
Je pensais qu'il serait lent d'utiliser l'instruction for dans NumPy, mais ce n'était pas le cas.
La commande de traduction (TUI) faite par refroidissement est trop pratique, alors utilisez-la!
python Je ne sais pas comment obtenir le nom de l'imprimante que j'utilise habituellement.
J'ai essayé de publier mon propre module pour pouvoir l'installer
Il est plus pratique d'utiliser csv-table lors de l'écriture d'une table avec python-sphinx
Créer un outil de génération de documents Python car il est difficile d'utiliser sphinx
J'ai essayé de vérifier le théorème du Big Bang [Est-il sur le point de revenir?]
L'expérience de Hackason selon laquelle il est le plus important de comprendre les sentiments de l'organisateur
J'ai essayé de créer OneHotEncoder, qui est souvent utilisé pour l'analyse des données, afin qu'il puisse atteindre l'endroit qui démange.
Je souhaite utiliser la fonction d'activation Mish
Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python
La commande pour générer le bibtex RFC est pratique, alors livrez-la à tous les étudiants X
Comment résoudre le problème que l'écran de connexion ne s'affiche pas pour toujours sur Ubuntu 19.04 car il s'arrête au logo au démarrage
Comment utiliser Raspeye Relay Module Python
Je voulais utiliser la bibliothèque Python de MATLAB
J'ai senti que j'avais porté le code Python en C ++ 98.
Je veux dire qu'il y a un prétraitement des données ~
Je veux utiliser le jeu de données R avec python
Le son émis par M. Tick sur le lieu de travail est ... J'ai réussi à le faire avec le code
Création d'un outil qui facilite la définition des paramètres des modèles d'apprentissage automatique
Utilisez la commande pushd, qui est plus pratique que la commande cd, pour revenir instantanément au répertoire d'origine.
[Python] Qu'est-ce qu'un tuple? Explique comment utiliser sans toucher et comment l'utiliser avec des exemples.
[VLC] Comment gérer le problème de ne pas être au premier plan pendant la lecture
[Python] Le statut de chaque préfecture du nouveau virus corona n'est publié qu'en PDF, mais j'ai essayé de le gratter sans le télécharger.
L'histoire quand j'étais accro à Caused by SSLError ("Impossible de se connecter à l'URL HTTPS car le module SSL n'est pas disponible.")