Array of Chars to String

Michael Spencer mahs at telcopartners.com
Wed Apr 20 14:19:16 EDT 2005


Peter Otten wrote:
> Michael Spencer wrote:
> 
> 
>>>>> def func_join(s, letters):
>>
>>...     return "".join(letter for letter in s if letter in set(letters))
> 
> 
> Make that
> 
> def func_join(s, letters):
>     letter_set = set(letters) 
>     return "".join(letter for letter in s if letter in letter_set)
> 
> for a fair timing of a set lookup as opposed to set creation.
> 
> Peter
> 
Sorry - yes!  I trip up over the early-binding of the outer loop, but the 
late-binding of the condition

Anyway, here are the revised timings, which confirm the speed-advantage of the 
translate approach.  And, as before, with such a short list of white-listed 
letters, it does not pay to create a set at all, even outside the loop.  Note 
the speed advantage of func_translate1 is 50:1 for long strings, so as Bengt 
pointed out, it's worth keeping this in mind for character-based filtering/joining.

  >>> def func_join1(s, letters):
  ...     return "".join(letter for letter in s if letter in letters)
  ...
  >>> def func_join2(s, letters):
  ...     letter_set = set(letters)
  ...     return "".join(letter for letter in s if letter in letter_set)
  ...
  >>> def func_translate1(s, letters, table=string.maketrans("","")):
  ...     return s.translate(table, table.translate(table, letters))
  ...

  >>> for multiplier in (1, 10, 100, 1000, 10000):
  ...     print "List multiplier: %s" % multiplier
  ...     print shell.timefunc(func_translate1, "Bob Carol Ted Alice" * 
multiplier, 'adB')
  ...     print shell.timefunc(func_join1, "Bob Carol Ted Alice" * multiplier, 
'adB')
  ...     print shell.timefunc(func_join2, "Bob Carol Ted Alice" * multiplier, 
'adB')
  ...
  List multiplier: 1
  func_translate1(...)  62295 iterations, 8.03usec per call
  func_join1(...)  36510 iterations, 13.69usec per call
  func_join2(...)  30139 iterations, 16.59usec per call
  List multiplier: 10
  func_translate1(...)  53145 iterations, 9.41usec per call
  func_join1(...)  7821 iterations, 63.93usec per call
  func_join2(...)  7031 iterations, 71.12usec per call
  List multiplier: 100
  func_translate1(...)  23170 iterations, 21.58usec per call
  func_join1(...)  858 iterations, 0.58msec per call
  func_join2(...)  777 iterations, 0.64msec per call
  List multiplier: 1000
  func_translate1(...)  3761 iterations, 132.96usec per call
  func_join1(...)  87 iterations, 5.76msec per call
  func_join2(...)  81 iterations, 6.18msec per call
  List multiplier: 10000
  func_translate1(...)  407 iterations, 1.23msec per call
  func_join1(...)  9 iterations, 56.27msec per call
  func_join2(...)  8 iterations, 64.76msec per call
  >>>






More information about the Python-list mailing list