item access time: sets v. lists

Paul McGuire ptmcg at austin.rr._bogus_.com
Wed Oct 4 12:28:18 EDT 2006


"David Isaac" <aisaac0 at verizon.net> wrote in message 
news:QWQUg.15396$3T2.2982 at trnddc06...
> Is it expected for access to set elements to be much
> slower than access to list elements?  Explanation?
> Thanks,
> Alan Isaac
>
>>>> t1=timeit.Timer("for i in set(xrange(10000)):pass","")
>>>> t2=timeit.Timer("for i in list(xrange(10000)):pass","")
>>>> t1.timeit(1000)
> 9.806250235714316
>>>> t2.timeit(1000)
> 3.9823075279120701
>
>
A couple of points:
1. Your use of timeit is a bit flawed.  You are not only timing the access 
into the set or list, but also the construction of the set/list, *every 
time*.  Use the second string arg (the one you are passing as "") for 
one-time initialization, so that you measure only access, which is what you 
say your are interested in.
2. Ooops, it turns out you're not really *accessing* the set/list, you are 
*iterating* over it.  Given that sets are implemented internally using a 
tree structure, I would expect that iterating over a list could be faster, 
although only marginally so.
3. Here are some stats for a little more correct timeits:

Construct list/set
set  -> 1.89524618352
list -> 0.299499796762

Iterate over list/set
set  -> 0.646887523414
list -> 0.552001162159

Random access to first item in list/set
set  -> 0.000189409547861
list -> 0.000160076210804

Random access to item in list/set when item exists
set  -> 0.000241650824337
list -> 0.0245168031132

Random access to item in list/set when item does not exist
set  -> 0.000187733357172
list -> 0.522086186932


The code:
import timeit

print "\nConstruct list/set"
t1=timeit.Timer("z = set(xrange(10000))","")
t2=timeit.Timer("z = list(xrange(10000))","")
print "set  ->", t1.timeit(1000)
print "list ->", t2.timeit(1000)

print "\nIterate over list/set"
t1=timeit.Timer("for i in z: pass","z = set(xrange(10000))")
t2=timeit.Timer("for i in z: pass", "z = list(xrange(10000))")
print "set  ->", t1.timeit(1000)
print "list ->", t2.timeit(1000)

print "\nRandom access to first item in list/set"
t1=timeit.Timer("0 in z","z = set(xrange(10000))")
t2=timeit.Timer("0 in z", "z = list(xrange(10000))")
print "set  ->", t1.timeit(1000)
print "list ->", t2.timeit(1000)

print "\nRandom access to item in list/set when item exists"
t1=timeit.Timer("500 in z","z = set(xrange(10000))")
t2=timeit.Timer("500 in z", "z = list(xrange(10000))")
print "set  ->", t1.timeit(1000)
print "list ->", t2.timeit(1000)

print "\nRandom access to item in list/set when item does not exist"
t1=timeit.Timer("10500 in z","z = set(xrange(10000))")
t2=timeit.Timer("10500 in z", "z = list(xrange(10000))")
print "set  ->", t1.timeit(1000)
print "list ->", t2.timeit(1000)


-- Paul





More information about the Python-list mailing list