IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Question bête sur les nombre à virugle


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de zebulon94
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 169
    Par défaut Question bête sur les nombre à virugle
    Bonjour à tous,

    Je devellope depuis la rentré 2008 avec python et je viens de finir la mise au point d'un programme d'analyse de log d'un parefeu.
    Lors d'un calcule de pourcentage j'obtient en résultat un nombre à virugle avec trop de chiffre après cette dernière, comment puis je faire pour réduire ce nombre de chiffre ?

    ex : j'ais 19.15643453813218637 dans la variable a
    j'aimerais 19.17. dans la variable a.

    Merci à tous et bonne journée

    P.S : vous pensez quoi d'un programe traitant un fichier log de 241 Mo en 780 minutes ...?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Par défaut
    Bonjour,

    utilise la fonction round()

    Tu fournis d'abord comme premier argument le nombre que tu souhaites arrondir puis comme deuxième argument le nombre de chiffre que tu souhaites avoir après le point.

    Exemple :

    Ceci te donnera un arrondi à deux chiffres après le point soit 1.24

    Concernant la taille de ton fichier et le temps de traitement, je n'en ai aucune idée.

  3. #3
    Membre confirmé Avatar de zebulon94
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 169
    Par défaut
    Ok merci pour la fonction c'est con mais je ne la connaissait pas.

    Avant de clore se sujet très passionant est ce que quelqu'un peut me dire se qu'il en pense de ces données :

    temps d'execution du programme avec un AMD Athlon XP cadensé à 2 Ghz et avec 448 Mo Ram:

    fichier log de 57 Mo environ 80min
    fichier log de 241 Mo environ 740min

    les données ne sont pas encore définitive.

    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Par défaut
    Pour formater l'affichage de données, on utilise plutôt les fonctions de formatage des chaînes de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> x = 19.15643453813218637 
    >>> print x
    19.1564345381
    >>> print "%.2f" % x
    19.16
    Je ne sais pas quel genre de traitement tu fais sur tes logs de parefeu. Mais plus d'une heure pour un fichier de 50 Mo ça me paraît énorme.

    N'ayant plus plus d'info, on te peut pas t'aider plus sur ce point. Vérifie tout de même que tu n'utilise pas la méthode readlines() sur tes gros fichiers. Utiliser readlines() charge le fichier entièrement en mémoire et retourne une liste de chaîne de caractères. Si tu fais ça avec des gros fichiers, tu vas ralentir de façon très importante ton programme.

    Tu peux également utiliser les profilers [1] Python afin de connaître les parties de code qui consomment le plus de temps CPU.

    [1] http://docs.python.org/library/profile.html

  5. #5
    Membre confirmé Avatar de zebulon94
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 169
    Par défaut
    Ce que tu dis m'interesse beaucoup, Je n'utilise pas de readlines() .
    Le programme traite seulement les requetes bloquées par le firewall, puis il les met dans un compte rendu ( format .txt ) pour avoir une idée de se qui se passe.
    Pour le fichier de 50 Mo le programme traite pres de 100 000 requete bloqué par le firewall.
    Un autre test nous donne comme résultat 202 lignes traité en moins de 10 sec


    Voici une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    try :
    		fichier_log = open(name_log,"r")
    	except IOError :
    		print "Fichier introuvable, vérifier le nom du fichier"
    	else:
    		comptage = 0
    		#déclaration des listes vides pour le compte rendu de l'opération P0
    		tableau = []
    		liste_p = []
    		liste_ip =[]
    		for ligne in fichier_log :
    			if re.search(".+ DENY +.",ligne) :
    				ip_src = re.findall("SRC=[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}",ligne)
    				ip_dest = re.findall("DST=[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}",ligne)
    				port_dest = re.findall("DPT=[0-9]{1,5}",ligne)
    				print "\n--------------------------------------------\n"
    				print "@ip source :", ip_src[0]
    				print "@ip destination :", ip_dest[0]
    				print "language correspondant :", port_dest
    				print "\n--------------------------------------------"
    				comptage = comptage + 1
     
    				if len(port_dest)!=0 : #and port_dest[0] not in liste_p :
    					liste_p.append(port_dest[0])
    				liste_ip.append(ip_src[0])
     
    				if len(port_dest) != 0 :
    					dico_ip = {'ip_src' : ip_src[0], 'ip_dest':ip_dest[0], 'port':port_dest[0], 'nb':1 }
     
    				else : 
    					dico_ip = {'ip_src' : ip_src[0], 'ip_dest':ip_dest[0], 'port':'*****', 'nb':1 }
     
    				if len(tableau) == 0 :
    					tableau.append(dico_ip) 
    				elif len(tableau) != 0 : 
    					trouver = 0
    					c = 0		
    					while trouver == 0 and c != len(tableau) :
    						if tableau[c]['ip_src'] == dico_ip['ip_src'] and tableau[c]['ip_dest'] == dico_ip['ip_dest'] and tableau[c]['port'] == dico_ip['port'] :
    							tableau[c]['nb'] = tableau[c]['nb'] + 1 
    							trouver = 1 
    						else :
    							c=c+1
     
    					if trouver == 0 :
    							tableau.append(dico_ip)
    Les listes sont ensuite envoyé dans une fonction calculant le pourcentage d'apparation de tel port ou tel adresse

  6. #6
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Par défaut
    En lisant rapidement, quelques remarques :

    - puisque tes expressions régulières sont toujours les mêmes et que tu les utilises un très grand nombre de fois, il serait mieux de les compiler [1] :
    [...] the version using compile() is more efficient when the expression will be used several times in a single program.
    - je pense que tu peux également regrouper les 3 expressions régulières et utiliser plutôt les groupes de capture (parenthèse de groupement ( ) )

    - je pense que ton utilisation de la liste tableau est mauvaise, tu y fais de nombreux parcours pour y rechercher des éléments. Il ne sont pas conçus pour ça :
    How can I tell whether a certain element is contained in a list or array?
    Hearing the word "in" is an indication that you probably should have used a hash, not a list or array, to store your data. Hashes are designed to answer this question quickly and efficiently. Arrays aren't.
    [2]
    Utilise donc plutôt un hash ou un set.



    [1] http://docs.python.org/library/re.html#re.compile
    [2] http://perldoc.perl.org/perlfaq4.htm...st-or-array%3f (FAQ de Perl, mais cette question est valable pour n'importe quel langage)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question bête sur les ancres
    Par zooffy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/01/2008, 14h28
  2. question bête sur les binaires
    Par ben_skywalker dans le forum Access
    Réponses: 4
    Dernier message: 01/06/2006, 11h29
  3. Question bête sur les conteneurs
    Par jadey dans le forum C++
    Réponses: 21
    Dernier message: 04/05/2006, 00h09
  4. [VB6]Question bête sur les paramètres optionels
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 20h33
  5. [MFC] Question bête sur les CListBox
    Par gwendo dans le forum MFC
    Réponses: 1
    Dernier message: 10/08/2005, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo