Bill Campbell wrote:
> I'm going to be doing some work where I'll be doing existence
> testings on keys on about a million records where it may require
> multiple passes so I'm a bit concerned about the timing of these
> tests.
> 
> Is there any significant performance difference between the
> tests, ``key in dictionary'' and ``dictionary.has_key(key)''?
> I would prefer using the ``key in'' because it's a bit easier to
> type, and can also be used with lists in addition to dictionaries.

Are you sure you have a problem? How long does it take to process 1000 records?

The best way to answer these questions is with the timeit module running 
production code on production data. Second best is to use timeit on simple test 
cases. Third best (a distant contender) is to guess and ask other people their 
opinion.

But since I am feeling lazy and not in a coding mood I will give you my opinion 
instead of showing you how to use timeit =:-0

I think 'key in dict' is faster than 'dict.has_key()' because it avoids the 
attribute lookup for has_key(). You can see that in Alan Munroe's post. Though 
if you are looking up keys in a loop you can hoist the lookup out of the loop 
with something like
d = {}
hk = d.has_key
for i in someList:
  if hk(i):
    # do something if i is in d

If you can write the code to use dict indexing and exception handling that may 
be faster than checking for the key, depending on how often the exception is 
raised.

Finally, if you post a code snippet of what you are trying to do on 
comp.lang.python you will likely get many well-considered responses. The real 
experts in optimization hang out there.

HTH
Kent

> 
> A related question is where's the trade-off between using ``in''
> with a list, and a dictionary?  I presume that using it with
> small hashes will be faster than dictionries since it doesn't
> have to calculate the hashes.
> 
> Bill
> --
> INTERNET:   [EMAIL PROTECTED]  Bill Campbell; Celestial Software LLC
> UUCP:               camco!bill  PO Box 820; 6641 E. Mercer Way
> FAX:            (206) 232-9186  Mercer Island, WA 98040-0820; (206) 236-1676
> URL: http://www.celestial.com/
> 
> Government is the great fiction, through which everbody endeavors to
> live at the expense of everybody else.  -- Frederic Bastiat
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to