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 _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python