Переключатель быстрее.
Просто 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/
Это очень быстро (менее 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