Python : f-string vs str()
Quelle est la différence de performance entre f"{x}"
et str(x)
?
Voici mes tests qui m’ont surpris, car je m’attendais à l’inverse :
from typing import Dict
def benchmark() -> None:
"""Main
function for benchmark.
"""
t1 = timeit.timeit("f_str()",
globals=globals(),
number=50000000)
t2 = timeit.timeit("u_str()",
globals=globals(),
number=50000000)
t3 = timeit.timeit("n_str()",
globals=globals(),
number=50000000)
d: Dict[str, float] = {
"f-string": t1,
"str": t2,
"no str": t3
}
s: Dict[str, float] = {k: v
for k, v
in sorted(d.items(),
key=lambda i:
i[1])}
f: float = min(s.values())
print("Method\tTime\tPerc.")
print("------\t----\t-----")
for k, v in s.items():
p: float = (v / f) * 100
print(f"{k}\t{v:.2f}\t{p:.2f}%")
if __name__ == "__main__":
import timeit
class T:
def __init__(
self, l: str) -> None:
self.l: str = l
o: T = T("test")
def f_str() -> str:
return f"{o.l}"
def u_str() -> str:
return str(o.l)
def n_str() -> str:
return o.l
benchmark()
Explications
f"{self.label}"
utilise le mécanisme d’interpolation de chaînes de caractères de Python qui peut être légèrement plus rapide parce qu’il est optimisé pour concaténer des littéraux de chaîne et des variables ;str(self.label)
appelle explicitement le constructeur de la classe str, ce est un peu plus lent en raison de l’appel de fonction.