I can see an in-house style guide strongly recommending f-strings over % formatting
In [4]: a, b, c, d = ("123", "456", "789", "0ab") In [5]: %timeit a + "-" + b 139 ns ± 10 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [6]: %timeit "%s-%s" % (a, b) 198 ns ± 13.8 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [7]: %timeit "{}-{}".format(a, b) 248 ns ± 9.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [8]: %timeit f"{a}-{b}" 99 ns ± 2.48 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [9]: %timeit a + "-" + b + "-" + c + "-" + d 344 ns ± 10.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [11]: %timeit "%s-%s-%s-%s" % (a, b, c, d) 290 ns ± 9.64 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [12]: %timeit ''.join([a, '-', b, '-', c, '-', d]) 245 ns ± 2.32 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [13]: %timeit "{0}-{1}-{2}-{3}".format(a, b, c, d) 471 ns ± 23.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [14]: %timeit f"{a}-{b}-{c}-{d}" 176 ns ± 11.9 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)