Так что это вещь CPython, не совсем уверен, что она ведет себя так же с другими реализациями.
Но '{0}'.format()
быстрее, чем str()
и '{}'.format()
. Я публикую результаты с Python 3.5.2, но я попробовал это с Python 2.7.12, и тенденция та же.
%timeit q=['{0}'.format(i) for i in range(100, 100000, 100)]
%timeit q=[str(i) for i in range(100, 100000, 100)]
%timeit q=['{}'.format(i) for i in range(100, 100000, 100)]
1000 loops, best of 3: 231 µs per loop
1000 loops, best of 3: 298 µs per loop
1000 loops, best of 3: 434 µs per loop
Из документов на object.__str__(self)
Вызывается
str(object)
и встроенными функциямиformat()
иprint()
для вычисления «неформального» или удобного для печати строкового представления объекта.
Итак, str()
и format()
вызывают один и тот же метод object.__str__(self)
, но откуда такая разница в скорости?
ОБНОВЛЕНИЕ, как отметили @StefanPochmann и @Leon в комментариях, они получают разные результаты. Я попытался запустить его с помощью python -m timeit "..."
, и они правы, потому что результаты такие:
$ python3 -m timeit "['{0}'.format(i) for i in range(100, 100000, 100)]"
1000 loops, best of 3: 441 usec per loop
$ python3 -m timeit "[str(i) for i in range(100, 100000, 100)]"
1000 loops, best of 3: 297 usec per loop
$ python3 -m timeit "['{}'.format(i) for i in range(100, 100000, 100)]"
1000 loops, best of 3: 420 usec per loop
Так что кажется, что IPython делает что-то странное...
НОВЫЙ ВОПРОС: какой предпочтительный способ преобразования объекта в str
по скорости?
i.__str__()
напрямую. Хотяstr
действительно правильный путь. Это недостаточно быстро для вас? - person Stefan Pochmann   schedule 17.11.2016