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 :

Optimisation de test d'égalité de coordonnées [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Par défaut Optimisation de test d'égalité de coordonnées
    Bonjour,
    Je travaille sur un programme contenant des bombes et des explosions.
    J'ai décidé de créer une classe pour les bombes et une pour les explosions.
    Les explosions se déplacent d'un nombre de case défini et testent si leurs coordonnées sont les mêmes qu'une bombe à chaque déplacement, si c'est le cas, alors la bombe en question explose.
    Les explosions et les bombes sont donc des classes stockés dans 2 listes différentes, explosionlist et bomblist.
    J'utilise Tkinter pour la partie graphique
    Voilà comment se présente le test qui est une fonction de la classe explosion :

    self.x / self.y : coordonnées de l'explosion
    bomb.x / bomb.y : coordonnées de la bombe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for explosion in explosionlist :
            explosion.testcollision()
    Dans la classe explosion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def testcollision() :
            for bomb in bomblist :
                      if self.x==bomb.x and self.y==bomb.y :
                             bomb.explosion()
    Cette technique fonctionne mais je suis sûr qu'elle est mal optimisé, et ça se remarque grandement lorsqu'il y'a 100 bombes et 100 explosions.
    J'ai pas d'idées d'optimisations, je demande donc votre aide.
    Merci d'avance pour vos réponses !

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    un truc comme celui là pourrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bombset = set((bomb.x, bomb.y) for bomb in bomblist)
    bombdict = {(bomb.x, bomb.y):bomb for bomb in bomblist}
    explosionset = set((explosion.x, explosion.y) for explosion in explosionlist)
     
    for coord in (bombset & explosionset):
       bombdict[coord].explosion()
    l'idée c'est de tirer parti des sets qui permettent de faire l'intersection entre les deux listes de coordonnées, et des dictionnaires qui permettent ensuite de refaire correspondre les coordonnées avec l'instance de bombe concernée

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    L'opération serait instantannée si tu stockais l'ensemble du maillage. Par exemple si ta zone fais 10 par 10 alors tu peux commencer à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map = np.full((10,10),-1)
    Puis lorsque tu places une bombe tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    map[bomb.x, bomb.y]=len(list_bomb)  ### la nouveauté
    list_bomb.append(bomb) ### Que tu devais faire déjà
    Ainsi ta map sait si à une position donnée s'il y a une bombe. Et s'il y en a une, on a en plus son index dans la liste des bombes donc on peut accéder à l'objet bomb très rapidemment. Maintenant si tu veux tester si une explosion tombe sur une bombe, et bien tu as juste à regarder la valeur de map[explosion.x, explosion.y], si c'est 0 pas d'explosion, si c'est autre chose alors tu as l'index de la bombe à faire exploser.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Par défaut
    Le programme tient les 200 ms par actualisation maintenant, merci beaucoup !

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

Discussions similaires

  1. [Bug ?] intval et test d'égalité fait ce qui lui plait.
    Par titoumimi dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2006, 10h17
  2. pb test d'égalité
    Par Choupinou dans le forum Langage
    Réponses: 3
    Dernier message: 28/06/2006, 11h35
  3. [Tableaux] optimiser le test if
    Par H-bil dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 11h58
  4. [XSL] test d égalité
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 17/05/2006, 14h14
  5. Test d'égalité entre deux algorithmes, ça existe, est-ce faisable ?
    Par davcha dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 25/04/2006, 18h04

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