Hi,
 
I want to repeatedly search a list to test whether that list contains a given 
element X.
Of course, I can use membership testing using "in" (list._contains__).
But how is this method implemented? It seems to just walk through the whole 
list from 
beginning to end (see timeit code below). Is it faster to do a binary search on 
a sorted list,
given that this task has to be done repeatedly? Can such a program be scaled to 
lists
that do not fit into memory (maybe using shelve?)?
 
This is the function I made:
 
import bisect
def binarySearch(haystack, needle):
 return haystack[bisect.bisect_right(haystack, needle) - 1] == needle
 
# needle is at the beginning of the sequence
>>> t = timeit.Timer("""import bisect
def binarySearch(haystack, needle):
 return haystack[bisect.bisect_right(haystack, needle) - 1] == needle
binarySearch(range(10**7), 0)""")
>>> t.timeit(100)
16.737915573068676
>>> t2 = timeit.Timer("0 in range(10**7)")
>>> t2.timeit(100)
16.304621956142682
>>> 
# needle is at the end of the sequence
>>> t = timeit.Timer("""import bisect
def binarySearch(haystack, needle):
 return haystack[bisect.bisect_right(haystack, needle) - 1] == needle
binarySearch(range(10**7), 10**7-1)""")
>>> t.timeit(100)
16.954997632380582
>>> t2 = timeit.Timer("10**7-1 in range(10**7)")
>>> t2.timeit(100)
36.3686376341127

Thank you in advance!

Regards,
Albert-Jan


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
All right, but apart from the sanitation, the medicine, education, wine, public 
order, irrigation, roads, a 
fresh water system, and public health, what have the Romans ever done for us?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to