2009-12-08 16 views
5
#!/usr/bin/python 

import random 
import string 

appendToFile = open("appendedFile", "a") 

# Generator 

for i in range(1, 100000): 

    chars = "".join([random.choice(string.letters) for i in xrange(15)]) 
    chars2 = "".join([random.choice(string.letters) for i in xrange(15)]) 

    appendToFile.write(chars + ":" + chars2 + "\n") 

appendToFile.close() 

Codice modificato da this question.Rapidamente alfabetizza un file di grandi dimensioni tramite python

Il codice sopra riportato genera 100.000 righe di testo casuale nel formato di STRING: STRING. Il file di testo risultante è 3,1 MB.

Come si alfabetizza rapidamente il file utilizzando la prima STRING in STRING: STRING? Il caso è irrilevante.

L'ordinamento a bolle è molto lento, no?

+1

dobbiamo approfittare del fatto che questo può andare bene in RAM su macchine moderne, o avete bisogno di una routine come il vero tipo Unix (1) di comando che può memorizzare nella cache i risultati intermedi su disco e in modo da lavorare su file di dimensioni illimitate? –

+0

Vantaggio della RAM in eccesso. – torger

risposta

5

Questo è molto veloce (meno di 1 secondo sul mio computer). Usa un tipo insensibile alle maiuscole e minuscole, che presuppone cosa intendi per "caso è irrilevante"?

#!/usr/bin/python 

appendToFile = open("appendedFile", "r") 
sortToFile = open("sortedFile", "w") 

for line in sorted(appendToFile, key = str.lower): 
    sortToFile.write(line) 
+2

Perché non solo:' ... sorted (..., key = str.lower) '? –

8

Il primo approccio ovvio è semplicemente utilizzare la funzionalità di ordinamento incorporata in Python. Non è questo quello che avevi in ​​mente? Se no, perché? Con solo 100.000 righe di testo casuale, l'ordinamento predefinito sarebbe molto veloce.

lst = open("appendedFile", "rt").readlines() 
lst.sort(key=str.lower) 

Fatto. Potremmo farlo come un one-liner, se si voleva davvero:

lst = sorted(open("appendedFile", "rt").readlines(), key=str.lower) 

EDIT: Ho appena controllato, e strings.letters comprende sia maiuscole e minuscole. Quindi, il codice precedente viene modificato per essere sensibile al maiuscolo/minuscolo.

EDIT: più di ordinamento in Python: http://wiki.python.org/moin/HowTo/Sorting

+0

Se no, perché? - Nuovo per Python XD. Ho creato quel codice in modo da avere un file su cui lavorare. – torger

+0

FYI, l'ordinamento Python per liste è un ordinamento di tipo merge. Complessità O (n * log n). – BrainCore

1

Prova questo (case insensitive):

l=file(appendedFile).readlines() 
l.sort(key=lambda x:x.lower()) 

Per questi tipi di dimensioni dall'ottimizzazione non è davvero necessario (timing sulla mia macchina lenta ;-) :

[email protected]:~$ time python -c "l=file('appendedFile').readlines();l.sort(key=lambda x:x.lower())" 

real 0m0.615s 
user 0m0.576s 
sys 0m0.024s 
+0

Grazie per il meccanismo di temporizzazione - non sapevo che esistesse. – torger

+0

Il comando "tempo" è disponibile sotto Linux. Probabilmente è disponibile su Mac OS X. Puoi anche ottenerlo per Windows, ma Microsoft non lo ha creato. Il modo più semplice per ottenerlo per Windows è installare Cygwin. Un approccio puramente basato su Python, che è quindi portatile, consiste nell'utilizzare il modulo "timeit": http://docs.python.org/library/timeit.html – steveha

+0

@CrhistopheD, non è necessaria la funzione 'lambda' ; puoi semplicemente usare: 'key = str.lower' – steveha

Problemi correlati