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 :

Discussion : Psutil surcoté ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Discussion : Psutil surcoté ?
    Bonjour,

    Cela fait quelque temps que je n'étais pas venu poser une question à la con !!!

    J'utilisais autrefois psutil pour parcourir la liste des processus en cours sur mon PC, mais j'ai remarqué que le module psutil est plus lent que la plupart des autres méthodes que l'on peut retrouver dans les archives de l'internet !

    Alors pourquoi on ne retrouve sur les forums presque uniquement la solution psutil ?
    Certes le code est souvent moins "beau" mais il ne tient pas à grand chose d'en faire un nouveau module ou une fonction pour cacher le code.

    Voilà un script relativement simple pour comparer 2 méthodes pour le calcul de "l'âge" d'un processus :
    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
    import os, time, datetime, threading
    import subprocess, psutil, statistics
     
    def perf_psutil(n=100):
        liste = []    
        count = 0
        ct = time.time()
        while count < n:
            count+=1
            t0 = time.perf_counter_ns()
            p = [proc.create_time() for proc in psutil.process_iter() if proc.name() == "explorer.exe"][0]
            d = ct - p
            t1 = time.perf_counter_ns()
            liste.append(t1-t0)
     
        print("Date in sec:",p)
        print("Duration:",d)
        print("Performance psutil :", statistics.mean(liste)/10**9)
     
    def perf_wmic(n=100):
        liste = []    
        count = 0
        ct = datetime.datetime.now()
        while count < n:
            count+=1
            t0 = time.perf_counter_ns()
            p = [x.split(b'CreationDate=')[1] for x in subprocess.Popen('wmic PROCESS WHERE NAME="Explorer.exe" GET * /format:list <nul', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0].replace(b'\r\r\n',b',').split(b',') if x.startswith(b'CreationDate=')][0]
            d = datetime.datetime.now()-datetime.datetime(int(p[:4]),int(p[4:6]),int(p[6:8]),int(p[8:10]),int(p[10:12]),int(p[12:14]),int(p[15:-4]))
            t1 = time.perf_counter_ns()
            liste.append(t1-t0)
     
        print("Date :",p)
        print("Duration:",d.total_seconds())
        print("Performance wmic :", statistics.mean(liste)/10**9)
     
    print('########## PSUTIL ##########')
    perf_psutil(10)
    print('############################')
    print('########### WMIC ###########')
    perf_wmic(10)
    print('############################')
    Le résultat est sans appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ########## PSUTIL ##########
    Date in sec: 1624790271.081833
    Duration: 18625.84829068184
    Performance psutil : 0.17050247
    ############################
     
    ########### WMIC ###########
    Date : b'20210627123751.081832+120'
    Duration: 18628.22999
    Performance wmic : 0.06602881
    ############################
    Dernière modification par Invité ; 27/06/2021 à 20h36.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par LeNarvalo Voir le message
    Certes le code est souvent moins "beau" mais il ne tient pas à grand chose d'en faire un nouveau module ou une fonction pour cacher le code.
    Comprenez que psutils apporte au programmeur une interface indépendante de l'environnement système lui permettant d'avoir un code qui tourne sans modification sur Windows, Linux,...

    Et vous êtes inquiet des quelques nanosecondes de CPU que çà coûte pourquoi coder avec Python? Préférez coder en C voire en assembleur, ce sera bien plus efficace (côté CPU) pour autant que vous ayez le temps de lire les documentations et mettre au point le tas de lignes de code qui vont avec.

    De plusune fois le code plus rapidement réalisé grâce à psutil, rien n'empêche d'essayer de l'optimiser et si virer psutil pour le remplacer par des appels directs plus efficace apporte quelque chose pourquoi pas...


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut
    @Wiz

    Re,

    Ah oui je n'avais pas songé aux autres OS... My bad !

    Je peux presque lancer 3 commandes avec WMIC au lieu d'une avec psutil dans un même laps de temps. Ca me paraissait beaucoup...

    Comme tu dis, je devrais plutôt me pencher sur du C si je veux de la performance. Va falloir que je m'y mette un jour.

    Pourquoi n'intègre-t-il pas ce que j'ai su dénicher à psutil ? Peut-être parce que WMIC est déconseillé ? (Trop gourmand ?)

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Tu ne compares pas deux outils Python, tu compares un outil interne Python avec un outil externe, écrit dans un autre langage plus rapide (peut-être du C) et que tu appelles dans Python. Cela n'est pas pareil et malheureusement, face à un truc dédié à une action précise, Python perd le combat s'il veut faire la même chose.

    Tu devrais aller lire ce billet...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par LeNarvalo Voir le message
    Pourquoi n'intègre-t-il pas ce que j'ai su dénicher à psutil ? Peut-être parce que WMIC est déconseillé ? (Trop gourmand ?)
    A la base, accéder à la table des processus du système se fait via les mêmes primitives.
    Par contre dans votre code, il y a une différence entre balayer la liste des processus pour filtrer celui qui tourne notepad.exe et récupérer sa date de création... et aller regarder la date de création du premier process qui tourne notepad.exe.

    La question serait plutôt comment faire mieux (si c'est possible) avec psutil que le code que vous avez posté.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    A la base, accéder à la table des processus du système se fait via les mêmes primitives.
    Par contre dans votre code, il y a une différence entre balayer la liste des processus pour filtrer celui qui tourne notepad.exe et récupérer sa date de création... et aller regarder la date de création du premier process qui tourne notepad.exe.

    La question serait plutôt comment faire mieux (si c'est possible) avec psutil que le code que vous avez posté.

    - W
    Salut !

    Je me demandais comment fonctionne WMIC, s'il parcoure la liste et me renvois juste le processus que je souhaite, où s'il atteint directement le processus, ce qui expliquerait la différence de temps de traitement.

    Bref, j'avais envie de râler sur psutil, que je boycotte depuis peu... Au lieu de suggérer psutil, j'estime que l'on pourrait proposer des solutions similaires à la mienne sur les forums.


    ---------------------
    Salut Sve@r,

    J'ai lu le billet de blog, Python est adapté à faire de la 3D ? C'est à dire ? Un moteur graphique 3D ? Ou un truc du genre tableau 3D ?

    J'adore python, mais je crois que je lui en demande trop = facilité et rapidité.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Je me demandais comment fonctionne WMIC, s'il parcoure la liste et me renvois juste le processus que je souhaite, où s'il atteint directement le processus, ce qui expliquerait la différence de temps de traitement.
    La table des processus est juste une table... Si on y cherche quelque chose, il va falloir balayer la table et probablement "filtrer" côté utilisateur (je ne sais pas si Windows a une mouture qui sait "filtrer", mais la question est à poser dans un forum Windows... pas dans un forum Python.


    Citation Envoyé par LeNarvalo Voir le message
    Bref, j'avais envie de râler sur psutil, que je boycotte depuis peu... Au lieu de suggérer psutil, j'estime que l'on pourrait proposer des solutions similaires à la mienne sur les forums.

    Tester un peu mieux votre code!

    Combien prend de temps lorsque le nom qu'on utilise comme filtre n'existe pas (ce qui force à regarder tous les process qui existent).
    Combien çà prend de temps de s'arrêter au premier processus qui matche côté filtre plutôt que de les balayer tous?

    Si vous n'avez pas fait ça avant de râler, je dirais "mauvais ouvrier ne trouve jamais bon outil..."

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Je me demandais comment fonctionne WMIC, s'il parcoure la liste et me renvois juste le processus que je souhaite, où s'il atteint directement le processus, ce qui expliquerait la différence de temps de traitement.
    Je ne suis pas certain que la question puisse se poser de cette façon. Car si tu réfléchis bien, seul un tableau associatif (ex un dictionnaire en Python) permet d'atteindre "directement" une cible. Si on reste sur une liste, on est obligé quelque part de la parcourir quand on veut atteindre un élément précis. Donc si WMIC connait les tableaux associatifs il peut le faire sinon...
    Mais comme je le disais, je pense que la différence de temps est plutôt due au fait que WMIC est prévu spécifiquement pour ça. Donc dans ce travail là il va écraser tout le monde. Peut-être qu'il a accès directement à la liste des processus de Windows ou un truc analogue.

    Citation Envoyé par LeNarvalo Voir le message
    Bref, j'avais envie de râler sur psutil, que je boycotte depuis peu...
    La question là peut se pose: que reproches-tu à psutil?

    Citation Envoyé par LeNarvalo Voir le message
    Au lieu de suggérer psutil, j'estime que l'on pourrait proposer des solutions similaires à la mienne sur les forums.
    Ben non, car comme wiztricks l'a bien fait remarquer, ta solution dépend de l'OS.

    Citation Envoyé par LeNarvalo Voir le message
    J'ai lu le billet de blog, Python est adapté à faire de la 3D ? C'est à dire ? Un moteur graphique 3D ? Ou un truc du genre tableau 3D ?
    Tu n'as pas bien lu. La 3D est juste donnée en exemple. Python peut tout faire et le faire assez bien donc aussi de la 3D (en fait je pense que le billet veut plutôt parler des calculs inhérents à la 3D quand par exemple on tourne l'image). Maintenant tu peux installer PyQw3D (si t'es sous Linux ça se fait en une ligne via pip3) et tu auras plein d'exemples de graphes 3D qui effectivements réagissent assez bien quand on les retourne dans tous les sens (enfin ça dépend aussi de ta machine évidememnt !!!)

    Citation Envoyé par LeNarvalo Voir le message
    J'adore python, mais je crois que je lui en demande trop = facilité et rapidité.
    Il n'est pas fait pour ça (va relire le billet) car il a ses limites. Et tu peux toi-même en faire l'expérience. Programme par exemple la recherche des 10000 premiers "nombres premiers" en C et en Python et lance tous les benchs que tu veux, Python ne gagnera pas.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/01/2005, 23h48
  2. Discussions sur la (les) syntaxe(s)
    Par Laurent Dardenne dans le forum Sepi
    Réponses: 11
    Dernier message: 02/01/2005, 20h25
  3. Réponses: 2
    Dernier message: 07/10/2004, 16h31

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