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

  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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 352
    Points : 36 879
    Points
    36 879
    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

  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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 352
    Points : 36 879
    Points
    36 879
    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

  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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 352
    Points : 36 879
    Points
    36 879
    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

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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.

  9. #9
    Invité
    Invité(e)
    Par défaut
    @wiztricks
    Je viens de tester avec un break, c'est mieux, 0.10 mais c'est dans un cas de figure particulier, celui où le process est pas tout en bas de la liste et pas en multiple exemplaires.

    @Sve@r
    Je lui reproche d'être lent et survalorisé dans les forums. T'as pas bien lu mon premier commentaire !

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 352
    Points : 36 879
    Points
    36 879
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    @wiztricks
    Je viens de tester avec un break, c'est mieux, 0.10 mais c'est dans un cas de figure particulier, celui où le process est pas tout en bas de la liste et pas en multiple exemplaires.

    En exécutant votre code chez moi, j'obtiens:

    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: 1624652049.5684035
    Duration: 258705.50254964828
    Performance psutil : 0.0087134411
    ############################
    ########### WMIC ###########
    Date : b'20210625221409.568403+120'
    Duration: 258707.37755
    Performance wmic : 0.1792429329
    ############################
    Ce qui relativise quelque peu l'intérêt d'utiliser WMIC...

    - W

  11. #11
    Invité
    Invité(e)
    Par défaut
    Le code de base ? Ou avec un break ?
    QUand bien même, je suis assez surpris de voir 0.0087 seconde pour une commande aussi gourmande.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    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 352
    Points : 36 879
    Points
    36 879
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Le code de base ? Ou avec un break ?
    QUand bien même, je suis assez surpris de voir 0.0087 seconde pour une commande aussi gourmande.
    Le même code.

    Par ailleurs pourquoi considérer cette commande comme "gourmande" ? On mesure des nanosecondes...

    - W

+ 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