Python 3, по-видимому, медленнее в перечислениях для минимального цикла, чем Python 2, с существенным запасом, который, похоже, ухудшается с более новыми версиями Python 3.
У меня есть Python 2.7.6, Python 3.3.3 и Python 3.4.0, установленные на моем 64-битном компьютере Windows (Intel i7-2700K - 3,5 ГГц) с 32-разрядной и 64-разрядной версиями каждого Установлен Python. Хотя нет существенной разницы в скорости выполнения между 32-битными и 64-битными для данной версии в пределах своих ограничений по доступу к памяти, существует очень значительная разница между различными уровнями версий. Я дам результаты времени говорить сами за себя:
C:\**Python34_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **900 msec** per loop
C:\**Python33_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **820 msec** per loop
C:\**Python27_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in range(10000000): cnt += 1"
5 loops, best of 2: **480 msec** per loop
Поскольку диапазон Python 3 "не совпадает с диапазоном Python 2" и функционально совпадает с Python 2 "xrange", я также приурочил следующее:
C:\**Python27_64**\python -mtimeit -n 5 -r 2 -s"cnt = 0" "for i in **xrange**(10000000): cnt += 1"
5 loops, best of 2: **320 msec** per loop
Легко видеть, что версия 3.3 почти в два раза медленнее версии 2.7, а Python 3.4 примерно на 10% медленнее, чем эта.
Мой вопрос: есть ли параметр или параметр среды, который исправляет это, или это просто неэффективный код, или интерпретатор делает больше для версии Python 3?
Кажется, что ответ Python 3 использует целые числа "бесконечной точности", которые раньше назывались "long" в Python 2.x по умолчанию "int", без какой-либо возможности использовать фиксированную длину бита Python 2 "int" и обрабатывает эту переменную длину "int", которая занимает дополнительное время, как описано в ответах и комментариях ниже.
Возможно, Python 3.4 несколько медленнее, чем Python 3.3, из-за изменений в распределении памяти для поддержки синхронизации, что немного замедляет выделение/освобождение памяти, что, вероятно, является основной причиной того, что текущая версия "длинной" обработки работает медленнее.