py2to3 не видит общую картину.Он просто создает некоторый эквивалентный код, заменяя функции, которые больше не создают списки, добавляя list
упаковщик, чтобы убедиться, что:
- можно добавить результат
- можно повторять результат столько раз, сколько нужно
(здесь также ставятся круглые скобки вокруг print
, ... но здесь это не актуально)
Поэтому он пытается сделатьваш код запускается, но производительность не гарантируется, как на всех .
В вашем примере оболочка списка бесполезна, поскольку dict
использует итератор.
Таким образом, этот инструмент полезен для быстрой работы кода, но его не следует использовать без сравнения с исходным кодом и определения того, что оставить / что изменить.
Инструмент, вероятно, можно улучшить до:
- избегать переноса, когда итератор используется в цикле
- избегать переноса, когда итератор передается объекту, который принимает итерацию в качестве ввода.
Inтвой случай
dict(zip(range(n), range(n)))
идеаленВсе хорошо и работает быстрее в Python 3, чем в Python 2, потому что он избегает создания промежуточного списка, поэтому оставьте это так.
эквивалент Python 2, который будет немного более сложным:
dict(itertools.izip(xrange(n), xrange(n)))
Мой совет, если у вас есть много кода для перевода (я был там):
- используйте
python -3
переключатель с интерпретатором Python 2, чтобы представить ваш код и получить некоторые предупреждения вместо того, чтобы иметьон падает в Python 3 (ну, он должен предупредить о несовместимости Python 3.x, которую 2to3 не может исправить тривиально, но он пропускает много случаев, ну, это лучше, чем ничего, например, он находитпечально известные has_key
звонки) - использовать
py2to3
и сравнить результаты с вашим исходным кодом, решить вручную , где применить изменения - вы также можете использовать множественный поиск / замену с такими инструментами, как GrepWin, чтобы делать то, что будет делать py2to3, только с меньшими рисками снижения производительности:
- поиск
iteritems
, замена на items
- поиск
xrange
, замена на range
- отслеживание
dict.has_key
вызовов, unicode
встроенный - Я могу забыть некоторые ...
- тестирование и предоставление вашего кода с помощью python 3. некоторые вещи невидимы для инструмента и опции
-3
, например, когда вы используете двоичный режим для чтения текстовых файлов и тому подобное.