Быстрое расположение большого файла в алфавитном порядке с помощью python
-
18-09-2019 - |
Вопрос
#!/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()
Код, измененный с этот вопрос.
Приведенный выше код генерирует 100 000 строк случайного текста в формате STRING:СТРОКА.Результирующий текстовый файл имеет размер 3,1 МБ.
Как можно быстро расположить файл в алфавитном порядке, используя первую строку в STRING:СТРОКА?Случай не имеет значения.
Пузырьковая сортировка происходит очень медленно, не так ли?
Решение
Это происходит очень быстро (на моем компьютере менее 1 секунды).Он использует сортировку без учета регистра, то есть предполагает, что вы подразумеваете под "регистр не имеет значения"?
#!/usr/bin/python
appendToFile = open("appendedFile", "r")
sortToFile = open("sortedFile", "w")
for line in sorted(appendToFile, key = str.lower):
sortToFile.write(line)
Другие советы
Очевидный первый подход заключается просто в использовании встроенной функции сортировки в Python.Разве это не то, что вы имели в виду?Если нет, то почему?Имея всего 100 000 строк случайного текста, встроенная сортировка была бы очень быстрой.
lst = open("appendedFile", "rt").readlines()
lst.sort(key=str.lower)
Выполнено.Мы могли бы сделать это как однострочник, если бы вы действительно захотели:
lst = sorted(open("appendedFile", "rt").readlines(), key=str.lower)
Редактировать:Я только что проверил, и strings.letters
включает в себя как заглавные, так и строчные буквы.Итак, приведенный выше код изменен, чтобы быть нечувствительным к регистру.
Редактировать:подробнее о сортировке в Python: http://wiki .python.org/moin/HowTo/Sorting
Попробуйте это (без учета регистра):
l=file(appendedFile).readlines()
l.sort(key=lambda x:x.lower())
Для таких размеров оптимизация на самом деле не нужна (тайминги на моей медленной машине;-):
christophe@orion:~$ time python -c "l=file('appendedFile').readlines();l.sort(key=lambda x:x.lower())"
real 0m0.615s
user 0m0.576s
sys 0m0.024s