New submission from Antti Haapala:

I benchmarked some f'' strings against .format, and surprisingly f'' was slower 
than .format in about all the simple cases I could think of. I guess this is 
because f'' strings implicitly use `''.join([])`.

The byte code for f'foo is {foo}' currently is

  1           0 LOAD_CONST               1 ('')
              3 LOAD_ATTR                0 (join)
              6 LOAD_CONST               2 ('foo is ')
              9 LOAD_GLOBAL              1 (foo)
             12 FORMAT_VALUE             0
             15 BUILD_LIST               2
             18 CALL_FUNCTION            1 (1 positional, 0 keyword pair)

It was mentioned here https://bugs.python.org/issue24965 but since I came up 
with the idea when inspecting this, I'd propose again here that a new opcode be 
added for f'' strings - BUILD_STRING n, with which f'foo is {foo}' could be 
compiled to 

              0 LOAD_CONST               2 ('foo is ')
              3 LOAD_GLOBAL              1 (foo)
              6 FORMAT_VALUE             0
              9 BUILD_STRING             2

instead. Internally this wouldn't even need to call `PyUnicode_Join`, but 
instead `seplen == 0` case could be refactored into a separate function. Not 
only with this is it possible to know the length of the string, but also the 
number of string components are already known, so it'd be possible to build a 
tuple fast from the values on stack.

And that way people doing micro benchmarks would find out that the new Python 
3.6 feature would not only look nice but also be a way to write 
better-performing code.

----------
components: Interpreter Core
messages: 266016
nosy: ztane
priority: normal
severity: normal
status: open
title: Make f'' strings faster than .format: BUILD_STRING opcode?
type: enhancement
versions: Python 3.6

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue27078>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to