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

Code modifié de this question.Rapidement alphabétiser un grand fichier via python

Le code ci-dessus génère 100 000 lignes de texte aléatoire au format STRING: STRING. Le fichier texte résultant est de 3,1 Mo.

Comment alphabétiser rapidement le fichier, en utilisant le premier STRING dans STRING: STRING? Le cas n'est pas pertinent.

Le tri des bulles est très lent, non?

+1

Sommes-nous de tirer profit du fait que cela peut tenir en mémoire vive sur les machines modernes, ou avez-vous besoin d'une routine comme la commande réelle type Unix (1) qui peut mettre en cache les résultats intermédiaires sur le disque et ainsi travailler sur des fichiers de taille illimitée? –

+0

Avantage de l'excès de RAM. – torger

Répondre

5

Ceci est très rapide (moins de 1 seconde sur mon ordinateur). Il utilise un type insensible à la casse, qui est ce que vous entendez par "cas n'est pas pertinent"?

#!/usr/bin/python 

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

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

Pourquoi pas juste:' ... trié (..., key = str.lower) '? –

8

La première approche évidente consiste simplement à utiliser la fonction de tri intégrée dans Python. N'est-ce pas ce que tu avais en tête? Si non, pourquoi? Avec seulement 100 000 lignes de texte aléatoire, le tri intégré serait très rapide.

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

Terminé. Nous pourrions le faire comme une doublure si vous avez vraiment voulu:

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

EDIT: Je viens de vérifier et strings.letters comprend à la fois les majuscules et les minuscules. Ainsi, le code ci-dessus est modifié pour être insensible à la casse.

EDIT: plus sur le tri en Python: http://wiki.python.org/moin/HowTo/Sorting

+0

Si non, pourquoi? - Nouveau sur python XD. J'ai créé ce code pour que vous ayez un fichier à partir duquel travailler. – torger

+0

FYI, le tri Python intégré aux listes est un tri par fusion. Complexité O (n * log n). – BrainCore

1

Essayez ceci (insensible à la casse):

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

Pour ce genre de tailles optimalisation est pas vraiment nécessaire (timings sur ma machine lente ;-) :

[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

Merci pour le mécanisme de synchronisation - ne savait pas qu'il existait. – torger

+0

La commande "time" est disponible sous Linux. Il est probablement disponible sous Mac OS X. Vous pouvez également l'obtenir pour Windows mais Microsoft ne l'a pas intégré. Le moyen le plus simple de l'obtenir pour Windows est d'installer Cygwin. Une approche purement Python, qui est donc portable, consiste à utiliser le module "timeit": http://docs.python.org/library/timeit.html – steveha

+0

@CrhistopheD, vous n'avez pas besoin de la fonction 'lambda' ; vous pouvez simplement utiliser: 'key = str.lower' – steveha