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))]
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()
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, ...
Il va falloir que je m'implique un peu plus, moi...
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.
Python c'est bon, mangez-en.