Implicit lists

Mark McEahern marklists at mceahern.com
Thu Jan 30 12:08:22 EST 2003


[Mike Meyer]
> I always thought that exceptions were expensive. Which makes me wonder
> why you aren't using "isinstance(something, str)" for that first test.

It's always best to test for performance assumptions.  When I run the
following, I get:

  $ junk.py
  aslist_except: 0.12
  aslist_isinstance: 0.22
  .
  ----------------------------------------------------------------------
  Ran 1 tests in 3.182s

  OK

ymmv,

// m

#!/usr/bin/env python

from __future__ import generators
import unittest
from time import clock

def time_it(f, *args):
    time_in = clock()
    result = f(*args)
    time_out = clock()
    return result, time_out - time_in

def aslist_isinstance(item):
    if isinstance(item, (list, tuple)):
        for x in item:
            yield x
    else:
        yield item

def aslist_except(item):
    try:
        item + ''
    except TypeError:
        for x in item:
            yield x
    else:
        yield item

class test(unittest.TestCase):

    def test(self):

        items = (('s', ['s']),
                 (range(10), range(10)),
                 ((1, 2, 3), [1, 2, 3]))

        functions = (aslist_except, aslist_isinstance)
        timing = {}

        count = 10000

        for c in xrange(count):
            for f in functions:
                timing.setdefault(f, 0)
                for item, expected in items:
                    result_iterator, elapsed = time_it(f, item)
                    timing[f] += elapsed
                    result = [x for x in result_iterator]
                    self.assertEquals(result, expected)

        for k, v in timing.items():
            print '%s: %0.2f' % (k.func_name, v)

if __name__ == '__main__':
    unittest.main()

-






More information about the Python-list mailing list