PDA

View Full Version : [PYTHON] ottimizzare ciclo e controlli


snowx
26-02-2012, 15:39
ho una parte di codice che controlla la presenza di valori in degli insiemi e se non sono presenti li aggiunge, altrimenti prende tutta la riga e la inserisce in una lista:

x, y, z, k, j, h = set(),set(),set(), set(), set(), set()
for i in righe:
if i[0] not in x and i[1] not in y and i[2] not in z and i[3] not in k\
and i[4] not in j and i[5] not in h:
i.add(i[0])
y.add(i[1])
z.add(i[2])
k.add(i[3])
j.add(i[4])
h.add(i[5])
else:
lista.append(i)


vorrei ottimizzarlo, poiche è abbastanza lento, consigli?

cdimauro
27-02-2012, 22:19
ho una parte di codice che controlla la presenza di valori in degli insiemi e se non sono presenti li aggiunge, altrimenti prende tutta la riga e la inserisce in una lista:

x, y, z, k, j, h = set(),set(),set(), set(), set(), set()
for i in righe:
if i[0] not in x and i[1] not in y and i[2] not in z and i[3] not in k\
and i[4] not in j and i[5] not in h:
i.add(i[0])
y.add(i[1])
z.add(i[2])
k.add(i[3])
j.add(i[4])
h.add(i[5])
else:
lista.append(i)


vorrei ottimizzarlo, poiche è abbastanza lento, consigli?
Intanto metti tutto dentro una funzione, perché in questo modo le variabili che dichiari risultano locali e sono le più veloci in assoluto a essere utilizzate in Python.

Vedi: LOAD_FAST, per andare veloci su CPython (http://www.appuntidigitali.it/16390/load_fast-per-andare-veloci-su-cpython/).

Per il resto:
def f(lista, righe):
listappend = lista.append
x, y, z, k, j, h = (set(), ) * 6
xadd = x.add
yadd = y.add
zadd = z.add
kadd = k.add
jadd = j.add
hadd = h.add
for i in righe:
i0, i1, i2, i3, i4, i5 = i
if i0 not in x and i1 not in y and i2 not in z and i3 not in k\
and i4 not in j and i5 not in h:
iadd(i0)
yadd(i1)
zadd(i2)
kadd(i3)
jadd(i4)
hadd(i5)
else:
listaappend(i)
P.S. Roba come listaappend, xadd, ecc. in futuro potrebbe essere molto più lenta di quella "naturale" (list.append, x.add, ecc.). :cool:

cdimauro
28-02-2012, 07:14
Intanto vedo che c'è un errore. Dove c'è iadd devi lasciare il vecchio i.add.

Poi la notte (soprattutto il sonno ristoratore) porta consiglio.

Se l'obiettivo è "raccogliere in una (anche nuova) lista tutti gli elementi di una lista che soddisfino una certa condizione" si fa subito e in maniera molto più elegante con una list comprehension:
def f(Righe):

ElementiTrovati = set()

return [Elemento for Elemento in Righe if Elemento not in ElementiTrovati]
Se non t'interessa l'ordine, te ne esci molto più velocemente così:
Lista = set(Righe)
Perché set crea un nuovo insieme, prendendo gli elementi da un oggetto sequenza (come le liste, appunto) o iteratore che gli si può passare.