[Numpy-discussion] searchsorted() and memory cache

Bruce Southey bsouthey at gmail.com
Fri May 9 09:36:31 EDT 2008


Hi,
I don't know if it helps, but Ulrich Drepper had a 9 part series about 
memory in Linux Weekly News (http://lwn.net). You can under all 9 linked 
under his name in the Guest archives 
(http://lwn.net/Archives/GuestIndex/)  as not all are linked together. 
The first one is:
http://lwn.net/Articles/250967/

What every programmer should know about memory, Part 1 
<http://lwn.net/Articles/250967/> (September 21, 2007)

In part 5 there was a comment on 'Cache-oblivious algorithms' by *akapoor*:

"i guess it's worth mentioning harald-prokop's 1999 thesis on "cache oblivious algorithms"
(http://citeseer.ist.psu.edu/prokop99cacheobliviou.html)."


Regards
Bruce


Francesc Alted wrote:
> A Friday 09 May 2008, Andrew Straw escrigué:
>   
>> I've got a big element array (25 million int64s) that searchsorted()
>> takes a long time to grind through. After a bit of digging in the
>> literature and the numpy source code, I believe that searchsorted()
>> is implementing a classic binary search, which is pretty bad in terms
>> of cache misses. There are several modern implementations of binary
>> search which arrange items in memory such that cache misses are much
>> more rare. Clearly making such an indexing arrangement would take
>> time, but in my particular case, I can spare the time to create an
>> index if searching was faster, since I'd make the index once but do
>> the searching many times.
>>
>> Is there an implementation of such an algorithm that works easilty
>> with numpy? Also, can you offer any advice, suggestions, and comments
>> to me if I attempted to implement such an algorithm?
>>     
>
> Well, if you can afford extra space for the hashes you can always use a 
> dictionary for doing the lookups.  In pure Python they are around 3x 
> faster (for arrays of 8 millions of elements) than binary searches.  If 
> your space is tight, you can build an extension (for example in Pyrex) 
> for doing binary search for your specific type (int64), for an small 
> improvement.  Finally, if you combine this approach with what is 
> suggesting Charles Harris (i.e. creating several levels of caches, but 
> not more than two, which in my experience works best), you can have 
> pretty optimal lookups with relatively low space overhead.
>
> See this thread for a discussion of the binary/hash lookup approaches:
>
> http://mail.python.org/pipermail/python-list/2007-November/465900.html
>
> Hope that helps,
>
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20080509/220f0cc7/attachment.html>


More information about the NumPy-Discussion mailing list