В отличие от многих случаев C++, Python, по-видимому, не так умен для оптимизации избыточных операций, даже между константами.
Я провел простой тест, чтобы проверить math.cos как в цикле, так и вне его.
В этом первом случае Python вычисляет cos (3) 10 миллионов раз:
from datetime import *
from math import *
ini = datetime.now()
for a in range(10000000):
x = cos(0)
fim = datetime.now()
print(fim - ini)
Результат примерно 0:00:01.360958
.
Теперь, просто заменив x = cos(0)
на x = 1
(или просто поместив cos(0)
в переменную вне цикла), время про В 3 раза быстрее: 0:00:00.429995
Теперь, если операция cos (0)
всегда генерирует константу (1), почему Python не оптимизирует выполнение с помощью кеша, тем самым избегая постоянного повторения одной и той же операции cos
?
Одна из философий Python - облегчить жизнь программисту. Но в данном случае происходит как раз обратное.
В Python нет такой вещи, как «константа»; все динамично. Таким образом, нет Python не могу оптимизирует повторяющиеся циклы, которые ничего не делают. Потому что, возможно, придет другой поток и назначит что-то еще глобальному cos
, что-то, что имеет побочные эффекты, или каждый раз возвращает случайное значение.
потому что нельзя все кэшировать? Если вам нужны повторяющиеся единицы - сохраните их сами и повторно используйте сохраненное значение
Я был бы очень удивлен, если бы какая-либо реализация C++ использовала кеш для cos
- я бы ожидал, что он будет либо свернут на константу во время компиляции, либо вычисляться каждый раз во время выполнения (если цикл не будет полностью оптимизирован). Python слишком динамичен, чтобы любая из этих оптимизаций действовала во время компиляции байт-кода.
Вы говорите ему выполнить cos
, и он это делает.
@ Питер Вуд, вот где возникает вопрос «умности», оптимизации производительности. Если бы Python был умнее, он бы создал кеш с результатом (поскольку cos (0)
всегда возвращает один и тот же результат)
Попробуйте поставить на него тайник и посмотрите, как он получит помедленнее. Кеширование платное.
Потому что вы должны сами это запрограммировать. Именно это имел в виду создатель C++, когда сказал: «Язык более высокого уровня». буквально во ВСЕХ его книгах. (Нет, серьезно, он всегда присутствует в самом начале.) Я не думаю, что Python призван упростить жизнь программистам, но должен быть менее «дорогим», чем языки более высокого уровня.
Вы имеете в виду петля подъема?