Why I think range is a wart.

Peter Dobcsanyi dpeter at designtheory.org
Thu Mar 14 13:39:23 EST 2002


Fredrik Lundh <fredrik at pythonware.com> wrote:
> 
> note that
> 
>    index = 0
>    for item in mylist:
>        <whatever>
>        index += 1
> 
> is faster than
> 
>    for index in range(len(mylist)):
>        item = mylist[index]
>        <whatever>
> 

Here is some timing with variations posted so far.

    i in range(len(ls)):              2.01
    x in ls; i+=1 :                   2.59
    lambda x:zip(range(len(x)), x):   3.86
    Iter class:                      10.7

I used python 2.2, and ran each functions 3000 times.
Code is attached.

--------------------------------------------------< code >-------------

import time
import sys

def foo(ls):
    for i in range(len(ls)):
        if ls[i] == '998':
            return i

def bar(ls):
    i = 0
    for x in ls:
        if ls[i] == '998':
            return i
        i += 1

literator = lambda x:zip(range(len(x)), x)

def fzip(ls):
    for x,y in literator(ls):
        if y == '998':
            return x

class Iter:
    def __init__(self, list):
        self.list = list
    def __getitem__(self, index):
        return(index, self.list[index])

def iter(ls):
    for x,y in Iter(ls):
        if y == '998':
            return x

def timing(f, x, n):
    a = time.clock()
    for i in range(n):
        f(x)
    b = time.clock()
    print b - a

ls = []
for i in range(1000):
    ls.append(str(i))

n = int(sys.argv[1])

print 'i in range(len(ls)):',
timing(foo, ls, n)

print 'x in ls; i+=1 :',
timing(bar, ls, n)

print'lambda x:zip(range(len(x)), x):',
timing(fzip, ls, n)

print 'Iter class:',
timing(iter, ls, n)

--------------------------------------------------< end of code >-------------



More information about the Python-list mailing list