building strings from variables

Neil Cerutti horpner at yahoo.com
Thu Oct 5 22:33:03 EDT 2006


On 2006-10-06, MonkeeSage <MonkeeSage at gmail.com> wrote:
> wesley chun wrote:
>> from the performance standpoint, i believe that #4 (list join)
>> from scott is the fastest. #1 (string formatting) is next
>> preferred only because #3 (string concat) is the worst [think
>> "realloc()"].  #2 is useful for when you have users who aren't
>> as comfortable with #1.
>
> I might have done something wrong here, but it looks like the %
> operator would be the fastest (negligibly). And string.Template
> is horribly slow(!).

It is the least mature of all the methods here tested. Perhaps it
will be made faster in the future. I tried your test with a few
variations, and nothing sped it up very much, e.g.; building the
Template object once, outside the test; using keyword args
instead of a dictionary.
 
Template is designed to provide more ammo for regex haters, I
guess.

Template does provide an interface for creating your own slow,
but modified, implementation of Template. ;-)

> import os, sys, string, timeit
>
> hl = [['working_dir', os.getcwd()],
>       ['ssh_cmd'    , 'ssh'],
>       ['some_count' , 5],
>       ['some_param1', 'cheese'],
>       ['some_param2', 'burger']]
>
> hd = dict(hl)
> ht = tuple(map(lambda x: x[1], hl))
> sys.modules['__main__'].__dict__.update(hd)
>
> def make_string_fmt():
>   out = "cd %s ; %s %d %s %s" % ht

Incidentally, changing the fmt test to be more similar to the
Template version doesn't slow it down much.

def make_string_fmt():
  out = "cd %(working_dir)s ; %(ssh_cmd)s %(some_count)d %(some_param1)s"\
        "%(some_param2)s" % hd

-- 
Neil Cerutti



More information about the Python-list mailing list