Partage
  • Partager sur Facebook
  • Partager sur Twitter

Set plus rapide que list !??

Sujet résolu
    13 janvier 2014 à 1:15:31

    Bonjour!

    Alors voilà, je codais un jeu de la vie avec pygame quand après avoir testé différentes solutions, je me suis rendu compte d'une chose:

    Les set sont beaucoup plus rapides que les listes:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from pygame import display,init
    from time import time
    RESOLUTION=(600, 400)
    init()
    fen = display.set_mode(RESOLUTION)
    
    tableau=[tuple([int(x[0]),int(x[1])])for x in[RESOLUTION[0]/2.0,RESOLUTION[1]/2.0],
    		 [RESOLUTION[0]/2.0+2,RESOLUTION[1]/2.0],
    		 [RESOLUTION[0]/2.0,RESOLUTION[1]/2.0+1],
    		 [RESOLUTION[0]/2.0+2,RESOLUTION[1]/2.0+1],
    		 [RESOLUTION[0]/2.0,RESOLUTION[1]/2.0+2],
    		 [RESOLUTION[0]/2.0+2,RESOLUTION[1]/2.0+2],
    		 [RESOLUTION[0]/2.0+1,RESOLUTION[1]/2.0+2]]
    
    for i in tableau:
    	fen.set_at(i, (128,128,128))
    	display.update(i[0], i[1], 1, 1)
    
    dispo = [[i, j] for i in range(-1, 2) for j in range(-1, 2)if not(i == 0 and j == 0)]
    alive = lambda a, b:bool(sum([1 for i, j in dispo if tuple([a[0]+i, a[1]+j])in tableau]) in b)
    
    	
    while 1:
    	fen.fill(0)
    	a = time()
    	tableau = set([[(i[0]+j, i[1]+k), fen.set_at(i, (128,128,128))][0] for i in tableau for j, k in dispo if alive((i[0]+j, i[1]+k), [3])])|set([i for i in tableau if alive(i, (2, 3))])
    	print time()-a
    	display.flip()
    

    quand on remplace les set par des listes:

    tableau = [[(i[0]+j, i[1]+k),fen.set_at(i, (128,128,128))][0] for i in tableau for j, k in dispo if alive((i[0]+j, i[1]+k), [3])] + [i for i in tableau if alive(i, (2, 3))]

    On a une vitesse bien inférieure.

    Ma question est : Pourquoi?



    -
    Edité par baltoo 13 janvier 2014 à 1:18:39

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      13 janvier 2014 à 10:16:18

      C'est comparable que si les deux conteneurs font le même emploi et retourne évidemment le même résultat attendu.

      Or Set et List sont des objets utilisés pour des emplois complètement différents. À toi de savoir quel est le plus adapté.

      • Set est rapide pour détecter la présence d'un objet dans un ensemble
      • List permet une itération plus rapide

      Dans ton algorithme tu dois voir lequel de ces deux avantages est le plus efficaces (à première vue les Set)

      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2014 à 11:12:07

        j'avais fait un truc similaire et j'avais pas trouvé plus rapide que frozenset()

        from pygame import display
        from random import randint
        scr = display.set_mode((500,500))
        p = frozenset((randint(200,300),randint(200,300))for foo in range(1500))
         
        while 1:
            q = {}
            for j,k in p:
                for x,y in ((-1,1),(0, 1),(1,1),(-1,0),(1,0),(-1,-1),(0,-1),(1,-1)):
                    i = (j+x),(k+y)
                    q[i] = q.setdefault(i,0)+1
            scr.fill(0)
            p = frozenset(scr.set_at(i,0xffffff)or i for i,j in q.items() if j == 3 or (i in p and j == 2))
            display.flip()

        -
        Edité par josmiley 13 janvier 2014 à 11:19:34

        • Partager sur Facebook
        • Partager sur Twitter

        Python c'est bon, mangez-en. 

          13 janvier 2014 à 16:12:55

          Merci beaucoup de vos réponses!

          Je vais voir du côté des autres types similaires aux set, ce type n'a pas l'air très connu, et c'est bien dommage.

          Sur ce, encore merci et bonne journée!

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            13 janvier 2014 à 16:27:48

            ce type n'a pas l'air très connu

            Pas d'accord avec ça, c'est seulement que les besoins ne s'en font pas sentir, car souvent l'itération est privilégiée. Les Set on les utilise souvent pour la suppression de doublon, et à partir du moment où tu as des objets où leur valeur sont identiques, Set ne fonctionne plus... on utilise les listes.

            Maintenant tu peux regarder du côté de deque, des arrays, ...

            • Partager sur Facebook
            • Partager sur Twitter
              13 janvier 2014 à 17:13:35

              Merci pour les info!

              Waou... j'en aurais pas mal appris aujourd'hui! ^^

              Mais ces connaissances, tu les as apprises où? Parce que je suppose que tu n'a pas lus et appris par cœur la doc de python, si? ;)

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                13 janvier 2014 à 17:44:10

                Je lis un bouquin, je teste sur interpréteur python... À force, c'est du déjà vu.
                • Partager sur Facebook
                • Partager sur Twitter
                  13 janvier 2014 à 17:50:37

                  D'accord, merci!

                  Il va falloir que je m'implique un peu plus, moi... ^^

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Set plus rapide que list !??

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown