A few months ago I’ve seen a tweet from a Python learner with a code snippet containing f-strings.
I asked, why she’s not using format()
.
She answered, that this is the new way of formatting strings.
I was curious about it as I didn’t hear about it before.
Seeing other people using it, I started to do it as well.
Two weeks ago I spotted a Pull Request on GitHub where somebody used f-strings to convert a value to a string as in the example below.
# Some more code above
val = 6
value = f"{val}"
# some more code
I was surprised by the usage of f-strings in this particular case.
Another user commented to use str()
instead.
This conversation led me to the question, which one of both is faster as it was a computationally intensive piece of code.
Using boxx.timeit
showed me the not irrelevant time difference.
from boxx import timeit
with timeit(name="f-strings"):
for i in range(500_000):
x = 6
f"{x}"
with timeit(name="str"):
for i in range(500_000):
x = 6
str(x)
“f-strings” spend time: 0.08900404
"str” spend time: 0.160588
Wondering why this is the case? Looking at the byte code gives us the answer. Python provides a module for such cases, the Disassemble-Module. Let’s have a closer look at what’s happening.
import dis
def f_string(number: int):
return f"{number}"
def str_string(number: int):
return str(number)
print("============================== f-strings ==============================")
dis.dis(f_string)
print("================================ str() ================================")
dis.dis(str_string)
The result is shown below.
$ python disassemble_bytecode.py
============================== f-strings ==============================
5 0 LOAD_FAST 0 (number)
2 FORMAT_VALUE 0
4 RETURN_VALUE
================================ str() ================================
9 0 LOAD_GLOBAL 0 (str)
2 LOAD_FAST 0 (number)
4 CALL_FUNCTION 1
6 RETURN_VALUE
As you can see the str_string
method consists of one more command (CALL_FUNCTION
). Function calls are expensive and f-strings don’t need to call a separate function.
To summarize f-strings are faster than str()
in terms of converting integers and such types to string.
But keep in mind, that we only had a look at simple types.
How they perform on more complex types is currently out of my knowledge as I didn’t test it.
This post was originally published to Medium.