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