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 :

occupation mémoire et CPU


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut occupation mémoire et CPU
    Bonjour,

    Je suis en train de développer un prg qui calcule toutes les combinaisons de jeu d'une partie de belote : jeu à 4 mains de 8 cartes.

    J'ai actuellement amené mon programme à traiter les cas avec 6 cartes.
    Ce traitement prends quand même 150 secondes et l'occupation mémoire atteint les 200 Mo (estimé avec le gestionnaire des taches windows et 100%du CPU).
    6 cartes génèrent entre 600 000 et 1 000 000 des cas possibles.

    J'estime que pour 8 cartes je devrais tendre vers les 2/3 milions de cas

    Avec ma progammation j'atteint donc les limites du raisonnable.

    J'ai travaillé avec des listes de listes:
    1 qui contient les plis de 4 cartes
    1 qui contient les différents cas, ex : [1,12,150,8000,125000] : la liste représente un cas et les chiffres sont les index des pli correspondant à ce cas dans la liste jeu.pli

    Pour établir ces cas je travaille par ittération :
    1 - 4 jeu de 8 cartes génères n cas :

    1ère carte
    2 ème carte : appel à un fonction qui dit si ce cas est possible en fonction des règles
    3 ème et 4ème cartes appel à la fonction de vérif des règles
    si on arrive au bout du tour c'est que c'est un cas qui respecte les règles donc 'a retenir' on ajoute le pli dans liste'pli' et on crée le cas dans liste 'cas'

    2- on reprends 1 par 1 les mains restantes de chaque cas et on recroise les jeux

    etc...

    j'utilise donc beaucoup de if elif ...de boucle, de append, de copie de liste.

    Ma question (enfin...) est :

    Avez-vous des conseils sur des pratiques, des modules de Python à utiliser me permettant de réduire nettement les temps de calcul et espace mémoire utilisé ?
    numarray apporterait-il un gain important ?

    il me faudrait pratiquement des gains par facteur 10 !

    Merci

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Pour accélérer l'exécution du programme sans toucher à l'algorithme, tu peux utiliser le module psycho disponible pour les processeurs x86. Ce module est en fait un compilateur à la volée qui te permet d'accélérer de manière substantielle ton code.

    Bien sûr, avant de compter sur ce module, une optimisation de l'algorithme utilisé et des choix d'implantation effectués est recomandable.

    Thierry

  3. #3
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    bonjour,

    Si j'ai bien compris, tu géneres une liste comprenant toutes les mains possibles à chaque lancement du logiciel.
    Si cette liste n'est pas amenée à être modifiée, pourquoi ne pas la pickeliser une fois pour toute?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonsoir,

    merci pour vos conseils.

    1- Psyco : gain de 20% en temps mais l'espace mémoire est occupé plus vite. je teste mon prog avec 6 cartes maxi en ce moment au passage à la 7ème il y aura une conso mémoire trop importante et là c'est les accès disque qui survienne et les temps de calcul décuplent car le cpu ne tourne plus au dessus de 10%

    2- pickle : Dans mes premières versions à chaque ittération je sauvegardais :
    les plis possibles :
    [ [carte1, carte2, carte3, carte4]1, [carte1, carte2, carte3, carte4]2,[etc ...]
    les cartes restantes par joueur :
    [ jeux associés au pli 1 : [ les jeux : [c1,c2,c3,c4],[c1,c2,c3,c4],[c1,c2,c3,c4],[c1,c2,c3,c4] ], jeux associés au pli 2 : [etc..

    c'était trop groumant en mémoire. Donc j'ai supprimé la liste des cartes restantes. Et pour lancer de nouveau croisement de jeux, les cartes restantes par joueur sont recalculées à partir des plis successifs réalisés.

    Coté liste de pli celle-ci s'accroit à chaque ittération mais ce qui rentre dans la liste n'est plus modifié. Une copie sur fichier serait donc envisageable mais je crains beaucoup les accès disque.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Avez-vous constaté un temps de traitement des listes de listes bien supérieur à des listes (à iso quantité de données) ??

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    eh bien je vous fourni la réponse : une liste de liste consomme beaucoup plus de ressource (mémoire et CPU) qu'une liste simple (avec le même nombre de données).

    En supprimant toutes mes listes de listes j'ai divisé par 4 ou 5 la mémoire consommé et gagné environ 20% de temps de calcul.

    En appliquant là-dessus psyco j'ai encore gagné 50% !


  7. #7
    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 : 49
    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
    Peut être dans ce cas gérer les données grace a une base de données.
    Ca ferais peut être encore gagné en ressource!

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/02/2007, 13h31
  2. Réponses: 5
    Dernier message: 02/10/2006, 14h35
  3. Réponses: 11
    Dernier message: 13/01/2006, 16h30
  4. Occupation mémoire
    Par Débéa dans le forum Oracle
    Réponses: 6
    Dernier message: 24/08/2005, 16h24
  5. différence entre varchar et text pour l'occupation mémoire
    Par champion dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/12/2004, 19h02

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