Быстрое расположение большого файла в алфавитном порядке с помощью python

StackOverflow https://stackoverflow.com/questions/1870541

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top