On Sun, Nov 18, 2012 at 7:42 PM, Mark Lawrence <breamore...@yahoo.co.uk> wrote: > To throw a chiseldriver into the works, IIRC a tuple is way faster to create > but accessing a list is much faster. The obvious snag is that may have been > Python 2.7 whereas 3.3 is completely different. Sorry but I'm currently > wearing my XXXL size Lazy Bone Idle Hat so have no figures to back my > probably incorrect memory up, anyone know anything about this?
It's not been my experience with Python 2.7 that list access is faster than tuple access. Tuples are as fast as or faster than lists, pretty much universally. They seem to have closed the gap a bit in Python 3.3, though, as the following timings show. For one-shot construction, tuples seem to be more efficient for short sequences, but then lists win for longer sequences, although not by much. Of course, lists are always going to be much slower if you build them up with appends and extends. C:\>python -m timeit -s "x = range(10)" "tuple(x)" 1000000 loops, best of 3: 0.773 usec per loop C:\>python -m timeit -s "x = range(10)" "list(x)" 1000000 loops, best of 3: 0.879 usec per loop C:\>python -m timeit -s "x = range(100)" "tuple(x)" 100000 loops, best of 3: 2.88 usec per loop C:\>python -m timeit -s "x = range(100)" "list(x)" 100000 loops, best of 3: 2.63 usec per loop C:\>python -m timeit -s "x = range(1000)" "tuple(x)" 10000 loops, best of 3: 37.4 usec per loop C:\>python -m timeit -s "x = range(1000)" "list(x)" 10000 loops, best of 3: 36.2 usec per loop C:\>python -m timeit -s "x = range(10000)" "tuple(x)" 1000 loops, best of 3: 418 usec per loop C:\>python -m timeit -s "x = range(10000)" "list(x)" 1000 loops, best of 3: 410 usec per loop For iteration, tuples are consistently 7-8% faster. C:\>python -m timeit -s "x = tuple(range(10))" "for i in x: pass" 1000000 loops, best of 3: 0.467 usec per loop C:\>python -m timeit -s "x = list(range(10))" "for i in x: pass" 1000000 loops, best of 3: 0.498 usec per loop C:\>python -m timeit -s "x = tuple(range(100))" "for i in x: pass" 100000 loops, best of 3: 3.31 usec per loop C:\>python -m timeit -s "x = list(range(100))" "for i in x: pass" 100000 loops, best of 3: 3.56 usec per loop C:\>python -m timeit -s "x = tuple(range(1000))" "for i in x: pass" 10000 loops, best of 3: 31.6 usec per loop C:\>python -m timeit -s "x = list(range(1000))" "for i in x: pass" 10000 loops, best of 3: 34.3 usec per loop C:\>python -m timeit -s "x = tuple(range(10000))" "for i in x: pass" 1000 loops, best of 3: 318 usec per loop C:\>python -m timeit -s "x = list(range(10000))" "for i in x: pass" 1000 loops, best of 3: 341 usec per loop For direct item access, tuples seem to be about 2-3% faster. C:\>python -m timeit -s "import operator as o; x = tuple(range(10)); g = o.itemgetter(*range(len(x)))" "g(x)" 1000000 loops, best of 3: 0.67 usec per loop C:\>python -m timeit -s "import operator as o; x = list(range(10)); g = o.itemgetter(*range(len(x)))" "g(x)" 1000000 loops, best of 3: 0.674 usec per loop C:\>python -m timeit -s "import operator as o; x = tuple(range(100)); g = o.itemgetter(*range(len(x)))" "g(x)" 100000 loops, best of 3: 4.52 usec per loop C:\>python -m timeit -s "import operator as o; x = list(range(100)); g = o.itemgetter(*range(len(x)))" "g(x)" 100000 loops, best of 3: 4.65 usec per loop C:\>python -m timeit -s "import operator as o; x = tuple(range(1000)); g = o.itemgetter(*range(len(x)))" "g(x)" 10000 loops, best of 3: 43.2 usec per loop C:\>python -m timeit -s "import operator as o; x = list(range(1000)); g = o.itemgetter(*range(len(x)))" "g(x)" 10000 loops, best of 3: 43.7 usec per loop C:\>python -m timeit -s "import operator as o; x = tuple(range(10000)); g = o.itemgetter(*range(len(x)))" "g(x)" 1000 loops, best of 3: 422 usec per loop C:\>python -m timeit -s "import operator as o; x = list(range(10000)); g = o.itemgetter(*range(len(x)))" "g(x)" 1000 loops, best of 3: 447 usec per loop -- http://mail.python.org/mailman/listinfo/python-list