И быстрее, чем % при проверке на нечетные числа?

Мне принципиальное различие - то, что Итераторы Java указывают между объектами, тогда как итераторы STL C++ указывают на объекты.

28
задан riza 21 January 2012 в 04:31
поделиться

6 ответов

Ага. Модуль timeit в стандартной библиотеке позволяет проверить эти вещи. Например:

AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x & 1' 'isodd(9)'
1000000 loops, best of 3: 0.446 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x & 1' 'isodd(10)'
1000000 loops, best of 3: 0.443 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x % 2' 'isodd(10)'
1000000 loops, best of 3: 0.453 usec per loop
AmAir:stko aleax$ python -mtimeit -s'def isodd(x): x % 2' 'isodd(9)'
1000000 loops, best of 3: 0.461 usec per loop

Как видите, на моем (first-day == old == slow ;-) Macbook Air решение & воспроизводимо на 7-18 наносекунд быстрее, чем % Решение .

timeit не только сообщает вам, что быстрее, но и на сколько (просто запустите тесты несколько раз), что обычно показывает, насколько это в высшей степени НЕважно (вы действительно ] заботиться о разнице в 10 наносекунд, когда накладные расходы на вызов функции составляют около 400?! -) ... эффективности, говорят около 97% время: преждевременная оптимизация - это корень всего зла.

что, как он объяснил, является цитатой из еще более старого высказывания Хора. Я думаю, все полностью убеждены, что ИХ случай приходится на оставшиеся 3%!

Поэтому вместо того, чтобы бесконечно повторять «это не имеет значения», мы (в частности, Тим Петерс заслуживает этой почести) вставили стандартный модуль библиотеки Python timeit , что упрощает измерение таких микротестов и тем самым позволяет хотя бы некоторым программистам убедить себя, что, хммм, этот случай ДЕЙСТВИТЕЛЬНО попадает в группу 97%! -)

59
ответ дан 28 November 2019 в 02:19
поделиться

Если честно, Я не думаю, что это имеет значение.

Первая проблема - удобочитаемость. Что имеет больше смысла для других разработчиков? Лично я ожидал бы модуло при проверке четности / нечетности числа. Я ожидал, что большинство других разработчиков ожидают того же. Вводя другой, неожиданный метод, вы можете затруднить чтение кода и, следовательно, его обслуживание.

Второй факт - это просто факт, что у вас, вероятно, никогда не будет узкого места при выполнении любой из операций. Я за оптимизацию, но ранняя оптимизация - худшее, что можно сделать на любом языке или в любой среде. Если по какой-либо причине определение четного или нечетного числа является узким местом, найдите самый быстрый способ решения проблемы. Тем не мение,

23
ответ дан 28 November 2019 в 02:19
поделиться

Лучшая оптимизация, которую вы можете получить, - это , а не помещать тест в функцию. " число% 2 " и "число & 1" - очень распространенные способы проверки нечетности / четности, опытные программисты мгновенно распознают шаблон, и вы всегда можете добавить комментарий, например, '#, если число равно странно, тогда бла-бла-бла, если вам действительно нужно, чтобы это было очевидно.

# state whether number is odd or even
if number & 1:
    print "Your number is odd"
else:
    print "Your number is even"
10
ответ дан 28 November 2019 в 02:19
поделиться

«вернуть число & 1 и истина или ложь»? Вау! Если вы помешаны на скорости (1) "return num & 1" (2) встроите его: if somenumber% 2 == 1 разборчив и превосходит isodd (somenumber) , потому что он избегает вызова функции Python.

4
ответ дан 28 November 2019 в 02:19
поделиться

Джон поднимает хороший вопрос. Реальные накладные расходы связаны с вызовом функции:

me@localhost ~> python -mtimeit -s'9 % 2'
10000000 loops, best of 3: 0.0271 usec per loop
me@localhost ~> python -mtimeit -s'10 % 2'
10000000 loops, best of 3: 0.0271 usec per loop

me@localhost ~> python -mtimeit -s'9 & 1'
10000000 loops, best of 3: 0.0271 usec per loop
me@localhost ~> python -mtimeit -s'9 & 1'
10000000 loops, best of 3: 0.0271 usec per loop

me@localhost ~> python -mtimeit -s'def isodd(x): x % 2' 'isodd(10)'
1000000 loops, best of 3: 0.334 usec per loop
me@localhost ~> python -mtimeit -s'def isodd(x): x % 2' 'isodd(9)'
1000000 loops, best of 3: 0.358 usec per loop

me@localhost ~> python -mtimeit -s'def isodd(x): x & 1' 'isodd(10)'
1000000 loops, best of 3: 0.317 usec per loop
me@localhost ~> python -mtimeit -s'def isodd(x): x & 1' 'isodd(9)'
1000000 loops, best of 3: 0.319 usec per loop

Интересно, что оба метода сохраняются одновременно без вызова функции.

4
ответ дан 28 November 2019 в 02:19
поделиться

Кроме злой оптимизации, она отнимает самое идиоматическое "var % 2 == 0", которое понимает каждый кодер, не глядя дважды. Таким образом, это также нарушает питоны дзен для очень маленького выигрыша.

Кроме того, a = b и True или False были заменены для лучшей читабельности на

return True if num & 1 else False

.
1
ответ дан 28 November 2019 в 02:19
поделиться
Другие вопросы по тегам:

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