Hi!

General advise when assembling strings is to not concatenate them repeatedly but instead use string's join() function, because it avoids repeated reallocations and is at least as expressive as any alternative.

What I have now is a case where I'm assembling lines of text for driving a program with a commandline interface. In this scenario, I'm currently doing this:

  args = ['foo', 'bar', 'baz']
  line = ' '.join(args) + '\n'

So, in other words, I'm avoiding all the unnecessary copying, just to make another copy to append the final newline.

The only way around this that I found involves creating an intermediate sequence like ['foo', ' ', 'bar', ' ', 'baz', '\n']. This can be done rather cleanly with a generator:

  def helper(s):
      for i in s[:-1]:
           yield i
           yield ' '
      yield s[-1]
      yield '\n'
  line = ''.join(tmp(args))

Efficiency-wise, this is satisfactory. However, readability counts and that is where this version fails and that is the reason why I'm writing this message. So, dear fellow Pythonistas, any ideas to improve the original versions efficiency while preserving its expressiveness?

Oh, for all those that are tempted to tell me that this is not my bottleneck unless it's called in a very tight loop, you're right. Indeed, the overhead of the communication channel TCP between the two programs is by far dwarving the few microseconds I could save here. I'm still interested in learning new and better solutions though.


Cheers!

Uli

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to