Я загрузил альфа-версию Python 3.6 из репозитория Python Github, и одна из моих любимых новых функций - это строковое форматирование строки. Он может быть использован как так:Почему буквальные форматированные строки настолько медленны в Python 3.6 alpha? (теперь исправлено в 3.6)
>>> x = 2
>>> f"x is {x}"
"x is 2"
Это, кажется, сделать то же самое, что и с помощью функции format
str
на экземпляре. Тем не менее, одна вещь, которую я заметил, заключается в том, что это буквальное форматирование строки на самом деле очень медленное, по сравнению с просто вызовом format
. Вот что timeit
говорит о каждом методе:
>>> x = 2
>>> timeit.timeit(lambda: f"X is {x}")
0.8658502227130764
>>> timeit.timeit(lambda: "X is {}".format(x))
0.5500578542015617
Если я использую строку в качестве аргумента timeit
«s, мои результаты по-прежнему показывает картину:
>>> timeit.timeit('x = 2; f"X is {x}"')
0.5786435347381484
>>> timeit.timeit('x = 2; "X is {}".format(x)')
0.4145195760771685
Как вы можете видеть, используя format
занимает почти наполовину. Я ожидал бы, что литеральный метод будет быстрее, потому что задействован меньший синтаксис. Что происходит за кулисами, из-за чего литеральный метод становится намного медленнее?
f-строки являются динамическими, поэтому строка должна генерироваться в каждом цикле; тогда как строка формата - это литерал, созданный до запуска кода, когда он преобразуется в байт-код. –
@AlexHall Возможно, это связано с тем, что 'x' присваивается локальной переменной при передаче методу' format', но ее нужно найти в 'globals' с помощью' f "..." ' синтаксис. – schwobaseggl
@AlexHall: это не ошибка. Существует просто другая реализация под капотом, так как строка формата должна анализироваться во время компиляции, тогда как 'str.format()' анализирует слоты в * runtime *. –