[pypy-commit] pypy default: optimize searchsorted for case of sorted keys

bdkearns noreply at buildbot.pypy.org
Thu Oct 9 21:44:09 CEST 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r73869:0e32a2a7d77c
Date: 2014-10-09 15:38 -0400
http://bitbucket.org/pypy/pypy/changeset/0e32a2a7d77c/

Log:	optimize searchsorted for case of sorted keys

diff --git a/pypy/module/micronumpy/selection.py b/pypy/module/micronumpy/selection.py
--- a/pypy/module/micronumpy/selection.py
+++ b/pypy/module/micronumpy/selection.py
@@ -359,24 +359,31 @@
 app_searchsort = applevel(r"""
     import operator
 
-    def _searchsort(a, op, val):
-        imin = 0
-        imax = a.size
-        while imin < imax:
-            imid = imin + ((imax - imin) >> 1)
-            if op(a[imid], val):
-                imin = imid + 1
-            else:
-                imax = imid
-        return imin
-
-    def searchsort(a, v, side, result):
+    def searchsort(arr, val, side, res):
+        val = val.flat
+        res = res.flat
         if side == 0:
             op = operator.lt
         else:
             op = operator.le
-        v = v.flat
-        result = result.flat
-        for i in xrange(len(v)):
-            result[i] = _searchsort(a, op, v[i])
+
+        size = arr.size
+        imin = 0
+        imax = size
+        last = val[0]
+        for i in xrange(len(val)):
+            key = val[i]
+            if last < key:
+                imax = size
+            else:
+                imin = 0
+                imax = imax + 1 if imax < size else size
+            last = key
+            while imin < imax:
+                imid = imin + ((imax - imin) >> 1)
+                if op(arr[imid], key):
+                    imin = imid + 1
+                else:
+                    imax = imid
+            res[i] = imin
 """, filename=__file__).interphook('searchsort')


More information about the pypy-commit mailing list