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

Переключатель быстрее.

Просто if/else-ing 30 попытки различные значения в цикле, и сравнивают его с тем же кодом с помощью переключателя для наблюдения, насколько быстрее переключатель.

Теперь, эти переключатель имеет одну настоящую проблему : переключатель должен знать во время компиляции значения в каждом случае. Это означает что следующий код:

// WON'T COMPILE
extern const int MY_VALUE ;

void doSomething(const int p_iValue)
{
    switch(p_iValue)
    {
       case MY_VALUE : /* do something */ ; break ;
       default : /* do something else */ ; break ;
    }
}

не скомпилирует.

Большинство людей будет тогда использовать, определяет (Aargh!), и другие объявит и определит постоянные переменные в той же единице компиляции. Например:

// WILL COMPILE
const int MY_VALUE = 25 ;

void doSomething(const int p_iValue)
{
    switch(p_iValue)
    {
       case MY_VALUE : /* do something */ ; break ;
       default : /* do something else */ ; break ;
    }
}

Так, в конце, разработчик должен выбрать между "скоростью + ясность" по сравнению со "связью кода".

(Не то, чтобы переключатель не может быть записан для сбивания с толку как ад... Большинство переключатель, который я в настоящее время вижу, имеет эту "запутывающую" категорию"... Но это - другая история...)

Редактирование 21.09.2008:

bk1e добавил следующий комментарий: " константы Определения как перечисления в заголовочном файле другой способ обработать это".

, Конечно, это.

точка типа экстерна должна была разъединить значение из источника. Определение этого значения как макрос, как простое объявление интервала константы, или как раз когда перечисление имеет побочный эффект встраивания значения. Таким образом, если определение, перечисление значений или изменение значения интервала константы, перекомпиляция была бы необходима. Объявление экстерна означает нет никакой потребности перекомпилировать в случае изменения значения, но в другой руке, не лишает возможности использовать переключатель. Заключение, являющееся Используя переключатель, увеличит связь между кодом переключателя и переменными, используемыми в качестве случаев . Когда это будет в порядке, затем используйте переключатель. Когда это не, тогда, не удивительно.

.

Редактирование 15.01.2013:

Vlad Lazarenko прокомментировал мой ответ, дав ссылку на его всестороннее исследование ассемблерного кода, сгенерированного переключателем. Очень enlightning: http://741mhz.com/switch/

5
задан Community 23 May 2017 в 12:31
поделиться

3 ответа

Это очень быстро (менее 1 секунды на моем компьютере). В нем используется сортировка без учета регистра, то есть предполагается, что вы имеете в виду под «регистром неактуально»?

#!/usr/bin/python

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

for line in sorted(appendToFile, key = str.lower):
    sortToFile.write(line)
5
ответ дан 18 December 2019 в 13:15
поделиться

Очевидный первый подход - просто использовать встроенную функцию сортировки в 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

8
ответ дан 18 December 2019 в 13:15
поделиться

Попробуйте следующее (без учета регистра):

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
1
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: