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

Calcul scientifique Python Discussion :

Comment réduire le temps d'exécution sous Windows?


Sujet :

Calcul scientifique Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut Comment réduire le temps d'exécution sous Windows?
    Bonjour,

    J'ai écrit un bout de programme qui fait des calculs avec des arrays Numpy.

    Le script tournant sous Windows XP est horriblement long à s'exécuter ..

    Premièrement le CPU est systématiquement chargé à 50%, je pense que cela vient du fait que ma machine est équipée d'un Core 2 Duo et que le script Python utilise 100% des capacités d'un des Core.

    Deuxièmement, il fait des accès disque en permanence .. il semblerait donc qu'il utilise de la mémoire virtuelle

    C'est sur le 2ième point que je voudrais faire quelque chose.

    Vu la très petite taille des arrays Numpy, il n'y a aucune raison d'utiliser de la mémoire virtuelle.
    Mon PC a 4 Go de RAM, je sais qu'XP ne peut en utiliser que 3 Go, mais le gestionnaire de tâches me dit que seulement 490Mo sont utilisés ... il y a donc 2,4Go de RAM non utilisés.

    Y a t-il un moyen pour forcer Python (ou Windows) à utiliser la RAM disponible plutôt que d'utiliser de la mémoire virtuelle?

    Merci d'avance à ceux qui pourraient m'aider.

    Bonne journée

  2. #2
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    es tu sur que le script fait swapper WinXp?
    ca me parait peut probable.

    teste peut être les temps d'execution via un time clock.
    Essaie de découper ton code pour en faire des tests unitaire et trouver la portion de code qui mérite d'être optimisée!

    est ce que ce n'est pas une fonction d'une librairie qui déclenche l'utilisation du disque dur, plutot que python. (hypothèse!)

    a+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par airod Voir le message
    es tu sur que le script fait swapper WinXp?
    ca me parait peut probable.
    Merci pour ta réponse.

    Effectivement, tu as sûrement raison !!
    Avec cette m.... de XP, on ne sait jamais ce qui se passe
    Je viens de constater qu'il y a des accès disque même si j'arrête tout ...

    Comme je débute, il faut que je regarde comment utiliser time clock.

    Le problème est que je fais de la simulation et j'utilise un pas de calcul de 1 microsecondes, ce qui fait 1 million de passages dans le calcul pour simuler 1 seconde
    Mais si j'augmente le pas de calcul, je peux me retrouver avec des imprécisions numériques qui produisent des divisions par zéro

    Les variables de mes matrices Numpy sont de type "float"

    Je ne sais pas si cela correspond à des valeurs codées sur 32 bits ou sur 64 bits.
    Peut-être qu'en augmentant la précision du calcul, je pourrais augmenter le pas de calcul, donc réduire le nombre de calculs par seconde et globalement gagner du temps même si les opérations sur 64 bits sont plus longues à exécuter que sur 32 bits.

    Bonne journée

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Par défaut, Numpy travaille en double précision. Si tu veux de la simple, il faut ajouter un dtype = numpy.float32 lors de la création des tableaux.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Par défaut, Numpy travaille en double précision. Si tu veux de la simple, il faut ajouter un dtype = numpy.float32 lors de la création des tableaux.
    Bonjour Matthieu et merci,

    Effectivement, j'ai remplacé "float" par "numpy.float64" et cela ne change rien; donc Numpy bosse bien en double précision comme tu me le confirmes ...

    Il va falloir que je cogite dur

    Mon prog a tourné 12 heures cette nuit pour me sortir un peu plus de 3 minutes de simulation ...
    Les résultats sont nickel, mais il faut être patient

    Bonne journée

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 694
    Points
    36 694
    Par défaut
    Salut

    Les disques qui tournent sous Windows... hélas, la bestiole veut faire tellement de truc que çà en est prise de tête pour savoir ce qu'il s'y passe vraiment. Personnellement j'en suis à préférer développer sous Linux ou OSX puis déployer sous Windows...
    Enfin bon, vous n'en êtes peut être pas à devoir appliquer ces remèdes.

    En mettant de côté le bruit du disque, vous dites:
    Premièrement le CPU est systématiquement chargé à 50%, je pense que cela vient du fait que ma machine est équipée d'un Core 2 Duo et que le script Python utilise 100% des capacités d'un des Core.
    => votre exécution est limité par la capacité CPU que vous pouvez lui donner

    Citation Envoyé par jlg_47 Voir le message
    Mon prog a tourné 12 heures cette nuit pour me sortir un peu plus de 3 minutes de simulation ...
    Que pourriez vous faire pour paralléliser l'exécution sur "beaucoup" de CPU?
    Sans trop savoir ce que font vos algos, impossible de vous suggérer autre chose qu'une sorte de direction de travail.

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

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    => votre exécution est limité par la capacité CPU que vous pouvez lui donner

    Que pourriez vous faire pour paralléliser l'exécution sur "beaucoup" de CPU?
    Sans trop savoir ce que font vos algos, impossible de vous suggérer autre chose qu'une sorte de direction de travail.

    - W
    Bonjour Wiztricks,

    Je ne sais pas si Python permet du calcul parallèle, car effectivement il y aurait la possibilité de paralléliser.

    Le problème est que je calcule des écoulements dans des tuyaux mis bout à bout et avec de faibles pertes de charge.
    A chaque pas de calcul, l'algo fait la différence de 2 nombres très voisins (des pressions) et la divise par un nombre très petit (la perte de charge) pour en sortir le débit. D'où division d'un nombre petit par un nombre petit

    Si j'intègre avec un très petit pas en temps (de l'ordre de 1 microseconde) il n'y a pas de problème car en une microseconde les valeurs des pressions et des débits évoluent peu, le calcul est stable et les résultats conforment aux attentes.
    Dès que j'augmente la valeur du pas de calcul d'un facteur 10, la division du nombre petit par un autre nombre petit finit par donner n'importe quoi et le calcul explose.

    Bonne journée et merci encore

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    La parallélisation fonctionnera si tu passes par Numpy ou si tu utilises le module processing, mais c'ets plus long pour ce dernier !

    Il faut que tu regardes la taille mémoire occupé par le process Python. De toute manière, tu peux estimer cette taille puisque tu connais la taille de ton problème !
    Si tu veux aller plus vite, il faut vectoriser l'intégralité de ton code. Si tu fais des éléments finis ou des différences finies, c'est normalement simple à mettre en oeuvre dans Numpy.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Si tu veux aller plus vite, il faut vectoriser l'intégralité de ton code.

    Bonjour Matthieu,

    C'est déjà fait

    Je viens de gagner un facteur 1000 en me penchant un peu sur la géométrie de mes bouts de tuyau ... C'est comme dans la réalité ... si les tuyaux sont mal calibrés, l'écoulement passe mal, ça bloque ... En simulation le calcul explose.

    Après ajustement de la géométrie, le calcul se fait bien et je peux réduire le pas d'intégration et ça passe sans exploser

    Merci encore pour l'aide.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 694
    Points
    36 694
    Par défaut
    Impossible d'avoir obtenu un gain de 1000 en utilisant plus de capacités matérielles. C'est trivial, mais çà dit aussi que la chose n'est pas encore assez mure ce genre de questions - revoir la conception paie mieux.

    Le problème est que je calcule des écoulements dans des tuyaux mis bout à bout et avec de faibles pertes de charge.
    A chaque pas de calcul, l'algo fait la différence de 2 nombres très voisins (des pressions) et la divise par un nombre très petit (la perte de charge) pour en sortir le débit. D'où division d'un nombre petit par un nombre petit
    L'expérience dit que la modélisation de la perte de charge est une fonction monotone croissante dans le temps: de moins en moins lourd, les perturbations subies augmentent les turbulations (et la variation de pression), le débit diminue.

    Ne serait il pas possible de regarder à quoi çà correspond dans le modèle "macro"? Il doit lui aussi avoir des zones de linéarité qui pourraient permettre de 'borner' les effets des turbulations?

    Enfin, c'est, sans doute, une idée que vous avez déjà explorée.

    En tout cas bravo et bon courage

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

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

Discussions similaires

  1. code qui donne le temps d'exécution sous windows
    Par shadowless dans le forum C++
    Réponses: 3
    Dernier message: 20/06/2011, 18h03
  2. Réponses: 2
    Dernier message: 24/04/2011, 09h43
  3. comment exploiter les codes d'erreurs sous windows xp?
    Par lejum2005 dans le forum Windows XP
    Réponses: 4
    Dernier message: 03/03/2006, 18h26
  4. [FreePascal] Exécutables sous Windows et sous Linux
    Par etranger dans le forum Free Pascal
    Réponses: 8
    Dernier message: 24/09/2005, 20h58
  5. Réponses: 6
    Dernier message: 22/09/2005, 17h59

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