Thursday, May 1, 2014

Python: Maps, Comprehensions and Loops

Most of you will have seen this already but:

c = range(1000)
d = range(1,1001)

def foo(a,b):
  return b - a


def map_foo():
  e = map(foo, c, d)
  return e


def comprehend_foo():
  e = [foo(a, b) for (a,b) in zip(c,d)]
  return e


def loop_foo():
  e = []
  for (a,b) in zip(c,d):
    e.append(foo(a, b))
  return e

def bare_loop():
  e = []
  for (a,b) in zip(c,d):
    e.append(b - a)
  return e

def bare_comprehension():
  e = [b - a for (a,b) in zip(c,d)]
  return e

"""
python -mtimeit -s'import test' 'test.map_foo()'
python -mtimeit -s'import test' 'test.comprehend_foo()'
python -mtimeit -s'import test' 'test.loop_foo()'
python -mtimeit -s'import test' 'test.bare_loop()'
python -mtimeit -s'import test' 'test.bare_comprehension()'
"""

In order of speediness:

test.bare_comprehension() -> 10000 loops, best of 3: 97.9 usec per loop
test.map_foo() -> 10000 loops, best of 3: 125 usec per loop
test.bare_loop() -> 10000 loops, best of 3: 135 usec per loop
test.comprehend_foo() -> 10000 loops, best of 3: 159 usec per loop
test.loop_foo() -> 1000 loops, best of 3: 202 usec per loop

So, where-ever you can, use map. The reason map_foo is slower than bare_comprehension is the function overhead.

No comments:

Post a Comment