[Python] Algoritmo in CSV

Pietro Battiston me a pietrobattiston.it
Gio 2 Set 2010 15:22:03 CEST


Il giorno gio, 02/09/2010 alle 14.41 +0200, Vittorio Zuccala' ha
scritto:
> Buongiorno,
> chiedo consiglio su un algoritmo da usare che sia veloce.
> Anche solo in meta-codice.
> 
> Problema:
> - carico un CSV con 200 colonne e 2 milioni di righe
> - voglio trovare la lunghezza maggiore per ogni campo
> 
> Meta-codice
> * apri file csv
> * crea un oggetto csv_reader
> * crea un array "lunghezzamax"
> * leggi riga per riga
> * fai lo split dei campi e metti nell'array "campi"
> * per ogni campo guarda la lunghezza: se lunghezza(campi[i]) >
> lunghezza[i] allora lunghezza[i]=lunghezza(campi[i]) 
> 
> Ecco: il mio problema è che vengono effettuati 200*2.000.000 di IF e
> la cosa non mi piace molto.
> Qualcuno ha un consiglio per ottimizzare?

Come algoritmo in sé fatico a vedere qualcosa di migliore, per quel che
riguarda il tempo (come spazio, potresti volere utilizzare, invece
dell'array "campi", la funzione riga.index(",") per evitare di
memorizzarteli tutti).

Se però per "ottimizzare" intendi anche spostare qualcosa da funzioni in
Python al C sottostante in C, forse una leggera ottimizzazione in tempo
potrebbe consistere nel

* creare una lista lunghezze = [[]]*200

all'inizio, e sdoppiare l'ultimo (tuo) punto in:

* per ogni campo, lunghezze[i].append( len(campi[i]) )
* ogni tot ripetizioni, fare
  for i in xrange(num_campi):
      lunghezze[i].append(lunghezzamax[i])
      lunghezzamax[i] = max( lunghezze[i] )
      lunghezze[i] = []

addirittura, se dello spazio occupato in memoria non te ne frega niente
(e se le perfomance di cpython con le liste non si degradano al loro
crescere) "tot" potrebbe valere 2.000.000.

Ma non sarei pronto a scommettere che migliori davvero. Cioè: se succede
forse è più che altro per caratteristiche di ottimizzabilità "a priori"
del codice da parte dell'interprete, caratteristiche di cui non so nulla
(se provi facci sapere, sono curioso).

ciao

Pietro



Maggiori informazioni sulla lista Python