Я заметил снижение производительности при вычислении длины строки при профилировании моего перенесенного кода с python2 на python3. См. Тестовый пример ниже.
Есть ли способ заставить реализацию python3 соответствовать производительности python2?
Обратите внимание, что nsec = 1000 * usec
python2 -m timeit -n 10000000 "len('foo')"
> 10000000 loops, best of 3: 0.0294 usec per loop
python3 -m timeit -n 10000000 "len('foo')"
> 10000000 loops, best of 5: 44.1 nsec per loop (0.0441 usec)
Интерфейс стал медленнее, почему вам все равно?
Потому что это незначительный. Это никак не повлияет на общую производительность моего кода. Почему меня волнует бы?
В любом случае, вероятно, это связано с изменениями функции len
, а не list.__len__
, хотя я только догадываюсь. Вероятно, len
выполняет больше / разные проверки работоспособности в Python 3.
Фу. Извините, str.__len__
, и на самом деле этот может на самом деле связан с различиями в str.__len__
, поскольку str
в Python2 эквивалентен bytes
в Python 3. Попробуйте использовать литерал Unicode в коде Python 2, поэтому "len(u'foo')"
Разница почти незначительна, и оба гарантируют постоянное время. Почему тебя это беспокоит? В любом случае, без серьезного взлома вы ничего не можете поделать с реализацией
list.__len__
, которая в любом случае, вероятно, представляет собой простой доступ к атрибутам.