2009-12-08 13 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() 

Código modificado a partir de this question.Alfabetizar rápidamente un archivo grande a través de python

El código anterior genera 100.000 líneas de texto al azar en el formato de STRING: STRING. El archivo de texto resultante es 3.1 MB.

¿Cómo se alfabetizaría rápidamente el archivo con la primera STRING en STRING: STRING? El caso es irrelevante.

El tipo de burbuja es muy lento, ¿no?

+1

¿Hemos de aprovechar el hecho de que este puede caber en la memoria RAM en las máquinas modernas, o necesita una rutina como la (1) de comandos reales Unix tipo que puede almacenar en caché los resultados intermedios a disco y así trabajar en archivos de tamaño ilimitado? –

+0

Ventaja de exceso de RAM. – torger

Respuesta

5

Esto es muy rápido (menos de 1 segundo en mi computadora). Utiliza un tipo insensible a mayúsculas y minúsculas, ¿cuál es el significado al que se refiere con "caso es irrelevante"?

#!/usr/bin/python 

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

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

¿Por qué no simplemente:' ... sorted (..., key = str.lower) '? –

8

El primer enfoque obvio es simplemente usar la función de ordenamiento incorporada en Python. ¿No es esto lo que tenías en mente? Si no, ¿por qué? Con solo 100.000 líneas de texto aleatorio, el género incorporado sería muy rápido.

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

Listo. Podríamos hacerlo como una sola línea, si realmente quería a:

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

EDIT: Acabo de comprobar, y strings.letters incluye tanto mayúsculas y minúsculas. Por lo tanto, el código anterior se modifica para que no distinga entre mayúsculas y minúsculas.

EDIT: más en la clasificación en Python: http://wiki.python.org/moin/HowTo/Sorting

+0

Si no, ¿por qué? - Nuevo en Python XD. Creé ese código para que tuvieras un archivo para trabajar. – torger

+0

FYI, el ordenamiento de Python incorporado para las listas es un tipo de fusión. Complejidad O (n * log n). – BrainCore

1

Prueba esto (mayúsculas y minúsculas):

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

Para este tipo de tamaños optimización de su no es realmente necesario (tiempos en mi máquina 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

Gracias por el mecanismo de sincronización - no sabía que existía. – torger

+0

El comando "tiempo" está disponible en Linux. Probablemente esté disponible en Mac OS X. También puede obtenerlo para Windows pero Microsoft no lo compiló. La manera más fácil de obtenerlo para Windows es instalar Cygwin. Un enfoque puramente basado en Python, que es así portátil, es usar el módulo "timeit": http://docs.python.org/library/timeit.html – steveha

+0

@CrhistopheD, no necesita la función 'lambda' ; simplemente puede usar: 'key = str.lower' – steveha

Cuestiones relacionadas