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
>>>




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

Reply via email to