The following example seems to imply run time optimisation that I do not understand
Can anyone explain this behavior and how it may apply to more generic cases?
Example
Consider the following simple (example) functions
def y(x): # str output
y = 1 if x else 0
return str(y)
def _y(x): # no str
y = 1 if x else 0
return y
Assume I want to apply the function y upon all elements in a list
l = range(1000) # test input data
Result
A map operation will have to iterate through all elements in the list. It seems counter intuitive that breaking the function apart into a double map significantly outperforms the single map function
%timeit map(str, map(_y, l))
1000 loops, best of 3: 206 µs per loop
%timeit map(y, l)
1000 loops, best of 3: 241 µs per loop
More generically, this also applies to non standard library nested functions for example
def f(x):
return _y(_y(x))
%timeit map(_y, map(_y, l))
1000 loops, best of 3: 235 µs per loop
%timeit map(f, l)
1000 loops, best of 3: 294 µs per loop
Is this a python overhead issue where map is compiling the low level python code where possible and consequently being throttled when it has to interpret a nested function?