Если вы не знаете, сколько элементов в списке, этот подход является наиболее универсальным
>>> '[{0}]'.format(', '.join([str(i) for i in [1,2,3]]))
'[1, 2, 3]'
Он гораздо проще для списка строк
>>> '[{0}]'.format(', '.join(['a','b','c']))
'[a, b, c]'
Это полностью зависит от ISA, для которого вы компилируете, и качества оптимизатора вашего компилятора. Не оптимизируйте преждевременно: сначала профилируйте , чтобы найти узкие места .
Тем не менее, в x86 вы обнаружите, что оба они одинаково быстры в большинстве случаев. В обоих случаях у вас будут инструкции сравнения ( cmp
) и условного перехода ( jCC
). Однако для (x <0)
могут быть некоторые случаи, когда компилятор может опустить инструкцию cmp
, ускоряя ваш код на один полный цикл .
В частности, если значение x
хранится в регистре и недавно было результатом арифметической операции (например, добавить
или sub
], но существует гораздо больше возможностей), который устанавливает флаг знака SF в регистре EFLAGS, тогда нет необходимости в инструкции cmp
, и компилятор может выдать только инструкцию js
. Нет простой инструкции jCC
, которая перескакивает, когда входной сигнал равен -1.
js
. Нет простой инструкции jCC
, которая перескакивает, когда входной сигнал равен -1. а компилятор может выдать только инструкцию js
. Нет простой инструкции jCC
, которая перескакивает, когда входной сигнал равен -1. Это зависит от архитектуры, но x == -1 более подвержен ошибкам. x <0 - правильный путь.
Вы даже не можете ответить на этот вопрос вне контекста. Если вы попробуете тривиальный микробенчмарк, вполне возможно, что оптимизатор перенесет ваш код в эфир:
// Get time
int x = -1;
for (int i = 0; i < ONE_JILLION; i++) {
int dummy = (x < 0); // Poof! Dummy is ignored.
}
// Compute time difference - in the presence of good optimization
// expect this time difference to be close to useless.
То же самое, обе операции обычно выполняются за 1 такт.
Это может зависеть от того, какие операции предшествуют или завершились сравнением. Например, если вы присваиваете значение x непосредственно перед сравнением, тогда может быть быстрее проверить флаг знака, чем сравнивать с конкретным значением. Или на производительность прогнозирования ветвлений ЦП может повлиять то, какое сравнение вы выберете.
Но, как говорили другие, это зависит от архитектуры ЦП, архитектуры памяти, компилятора и многих других вещей, поэтому нет общего ответ.
x <0 будет быстрее. По крайней мере, он предотвращает выборку константы -1 в качестве операнда. В большинстве архитектур есть специальные инструкции для сравнения с нулем, так что это тоже поможет.
В любом случае, важное соображение заключается в том, что на самом деле точно направляет поток вашей программы и которое просто дает тот же результат?
Если x на самом деле и индекс или значение в перечислении, то -1 всегда будет тем, что вы хотите, или любое отрицательное значение сработает? Прямо сейчас -1 - это единственный минус, но это может измениться.
Попробуйте и убедитесь! Сделайте по миллиону, а лучше по миллиарду каждого из них и определите время. Бьюсь об заклад, в ваших результатах нет статистической значимости, но кто знает - может быть, на вашей платформе и компиляторе вы можете найти результат.
Это отличный эксперимент, чтобы убедить себя, что преждевременная оптимизация, вероятно, не стоит вашего времени - -и вполне может быть « корнем всех зол - по крайней мере, в программировании ».
Обе операции могут выполняться за один шаг ЦП, поэтому они должны иметь одинаковую производительность.
Как говорили другие, вероятно, нет никакой разницы. Сравнение - это настолько фундаментальные операции в ЦП, что разработчики микросхем хотят сделать их как можно быстрее.
Но есть еще кое-что, что вы могли бы рассмотреть. Проанализируйте частоты каждого значения и проведите сравнения в указанном порядке. Это может сэкономить вам довольно много циклов. Конечно, вам все равно нужно скомпилировать свой код в asm, чтобы проверить это.
Почему? Что бы вы ни делали, компилятор оптимизирует его на любой платформе, на которой вы в настоящее время компилируете.
Если вам нужно проверить, является ли оно -1, используйте (x == -1), если вы хотите знать, меньше ли оно нуля , используйте его вместо этого. Напишите то, что вы бы прочитали вслух.
Такие крошечные вещи не сделают ничего быстрее,
Я уверен, что вы уверены, что это настоящий оперативник.
Я полагаю, что вопрос о машине даст более надежный ответ, чем любой из нас может дать.
Я обнаружил, даже в коде, о котором вы говорите, мое предположение, что я знал, куда идет время было не совсем правильно. Например, если это внутренний цикл, если есть какой-либо вид вызова функции, даже невидимый, вставленный компилятором, стоимость этого вызова будет преобладать.
Николай, вы пишете:
Это на самом деле оператор узкого места в высоконагруженная программа. Производительность в эти 1-2 струны намного ценнее чем читабельность ...
Все узкие места обычно заключаются в маленький, даже в идеальном дизайне с идеальные алгоритмы (хотя нет такие). Я выполняю высоконагруженную обработку ДНК и знаю мою область и мои алгоритмы неплохо
Если да, то почему бы не сделать следующее:
Вы получите ответ.