Мне принципиальное различие - то, что Итераторы Java указывают между объектами, тогда как итераторы STL C++ указывают на объекты.
Ага. Модуль 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%! -)
Если честно, Я не думаю, что это имеет значение.
Первая проблема - удобочитаемость. Что имеет больше смысла для других разработчиков? Лично я ожидал бы модуло при проверке четности / нечетности числа. Я ожидал, что большинство других разработчиков ожидают того же. Вводя другой, неожиданный метод, вы можете затруднить чтение кода и, следовательно, его обслуживание.
Второй факт - это просто факт, что у вас, вероятно, никогда не будет узкого места при выполнении любой из операций. Я за оптимизацию, но ранняя оптимизация - худшее, что можно сделать на любом языке или в любой среде. Если по какой-либо причине определение четного или нечетного числа является узким местом, найдите самый быстрый способ решения проблемы. Тем не мение,
Лучшая оптимизация, которую вы можете получить, - это , а не помещать тест в функцию. " число% 2
" и "число & 1" - очень распространенные способы проверки нечетности / четности, опытные программисты мгновенно распознают шаблон, и вы всегда можете добавить комментарий, например, '#, если число равно странно, тогда бла-бла-бла, если вам действительно нужно, чтобы это было очевидно.
# state whether number is odd or even
if number & 1:
print "Your number is odd"
else:
print "Your number is even"
«вернуть число & 1 и истина или ложь»? Вау! Если вы помешаны на скорости (1) "return num & 1" (2) встроите его: if somenumber% 2 == 1
разборчив и превосходит isodd (somenumber)
, потому что он избегает вызова функции Python.
Джон поднимает хороший вопрос. Реальные накладные расходы связаны с вызовом функции:
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
Интересно, что оба метода сохраняются одновременно без вызова функции.
Кроме злой оптимизации, она отнимает самое идиоматическое "var % 2 == 0", которое понимает каждый кодер, не глядя дважды. Таким образом, это также нарушает питоны дзен для очень маленького выигрыша.
Кроме того, a = b и True или False были заменены для лучшей читабельности на
return True if num & 1 else False
.