'{0}'. Format () быстрее, чем str () и '{}'. Format (), используя IPython% timeit и в противном случае используя чистый Python

Итак, это вещь 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) метод, но откуда эта разница в скорости?

UPDATE, как @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 по скорости?

One Solution collect form web for “'{0}'. Format () быстрее, чем str () и '{}'. Format (), используя IPython% timeit и в противном случае используя чистый Python”

По какой-то причине время IPython просто выключено (хотя при тестировании с более длинной форматированной строкой в ​​разных ячейках оно несколько улучшилось ). Возможно, выполнение в одних и тех же ячейках неверно, не знаю.

В любом случае, "{}" немного быстрее, чем "{pos}" который быстрее, чем "{name}" пока они все медленнее, чем str .

str(val) – самый быстрый способ преобразования объекта в str ; он непосредственно вызывает объекты __str__ , если он существует, и возвращает результирующую строку. Другие, такие как format (или str.format ), включают дополнительные накладные расходы из-за дополнительного вызова функции (для format ); обрабатывая любые аргументы, анализируя строку формата и затем вызывая __str__ их args .

Для методов str.format "{}" использует автоматическую нумерацию; из небольшого раздела в документах по синтаксису формата :

Изменено в версии 3.1: Спецификаторы позиционного аргумента могут быть опущены, поэтому '{} {}' эквивалентно '{0} {1}' .

то есть, если вы укажете строку формы:

 "{}{}{}".format(1, 2, 3) 

CPython сразу знает, что это эквивалентно:

 "{0}{1}{2}".format(1, 2, 3) 

С строкой формата, содержащей цифры с указанием позиций; CPython не может принимать строго возрастающее число (которое начинается с 0 ) и должно анализировать каждую отдельную скобку, чтобы получить ее право, замедляя процесс в этом процессе:

 "{1}{2}{0}".format(1, 2, 3) 

Вот почему им также запрещено смешивать эти два:

 "{1}{}{2}".format(1, 2, 3) 

вы получите хороший ValueError когда вы попытаетесь сделать это:

 ValueError: cannot switch from automatic field numbering to manual field specification 

он также захватывает эти позиционные PySequence_GetItem с помощью PySequence_GetItem который, я уверен, является быстрым, по крайней мере, по сравнению с PyObject_GetItem [см. следующий].

Для значений "{name}" CPython всегда есть дополнительная работа, связанная с тем, что мы имеем дело с ключевыми словами, а не с позиционными; это включает в себя такие вещи, как построение словаря для вызовов и генерация пути более LOAD команд байтового кода для загрузки key s и значений. Ключевая форма вызова функции всегда вводит некоторые накладные расходы. Кроме того, кажется, что захват фактически использует PyObject_GetItem который несет некоторые дополнительные накладные расходы из-за его родового характера.

Interesting Posts

Как сделать скрипты python исполняемыми в Windows?

Повторная выборка массива numpy, представляющего изображение

как генераторы работают в python

functools.partial хочет использовать позиционный аргумент как аргумент ключевого слова

как включить прозрачность в vte.Terminal

Python – печатать список строк CSV в выровненных столбцах

Как отобразить список пользователей, использующих AJAX Django, которые обновляются при добавлении новых пользователей с админ-страницы

Как мы можем использовать iter_rows () в пакете openpyxl Python?

Не удалось выполнить операцию WriteBatch с помощью py2neo

Насколько сложно создать почтовый клиент? – Python

Первый набор данных (разброса) графика остается на графике во время анимации с помощью matplotlib Python

sqlalchemy flush () и получить вставленный идентификатор?

Установка django: нельзя использовать pip для установки django на linux (ubuntu)

Предотвращение перекрытия окна в GTK

Разработка приложений Python в Qt Creator

Python - лучший язык программирования в мире.