"David Isaac" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> 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


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to