My timing tests have never come across a case where it's faster, for those cases that can be expressed directly in a '%' format string:
% python3.3 -mtimeit 's="%s %s %s"' 's % (1, 3, 9)'
1000000 loops, best of 3: 0.361 usec per loop
% python3.3 -mtimeit 's="{} {} {}"' 's.format(1, 3, 9)'
1000000 loops, best of 3: 0.593 usec per loop
% python3.3 -mtimeit 'f="{} {} {}".format' 'f(1, 3, 9)'
1000000 loops, best of 3: 0.569 usec per loop
The construct "x % y" has special support in CPython. Quoting from ceval.c:
TARGET(BINARY_MODULO)
w = POP();
v = TOP();
if (PyUnicode_CheckExact(v))
x = PyUnicode_Format(v, w);
else
x = PyNumber_Remainder(v, w);
Py_DECREF(v);
Py_DECREF(w);
SET_TOP(x);
if (x != NULL) DISPATCH();
break;
That is, in the '%' case, if the left-hand side is a string, then go directly to the string format. Otherwise, go though the normal binary operation resolution mechanism.
While the "".format(x) path goes through the normal method invocation path - it has no special treatment.