Author: Antonio Cuni <anto.c...@gmail.com>
Branch: extradoc
Changeset: r5812:e138032bcc93
Date: 2017-07-12 08:54 +0200
http://bitbucket.org/pypy/extradoc/changeset/e138032bcc93/

Log:    add two more versions of the code

diff --git a/talk/ep2017/the-joy-of-pypy-jit/sobel/benchall.py 
b/talk/ep2017/the-joy-of-pypy-jit/sobel/benchall.py
--- a/talk/ep2017/the-joy-of-pypy-jit/sobel/benchall.py
+++ b/talk/ep2017/the-joy-of-pypy-jit/sobel/benchall.py
@@ -2,14 +2,14 @@
 import time
 import pypytools
 from mplayer import mplayer
-import v0, v1, v2, v3
+import v0, v1, v2, v3, v4, v5
 
 def bench():
     if len(sys.argv) == 2:
         v = sys.argv[1]
         versions = [globals()[v]]
     else:
-        versions = [v0, v1, v2, v3]
+        versions = [v0, v1, v2, v3, v4, v5]
         
     if pypytools.IS_PYPY:
         max_frames = 200
diff --git a/talk/ep2017/the-joy-of-pypy-jit/sobel/main.py 
b/talk/ep2017/the-joy-of-pypy-jit/sobel/main.py
--- a/talk/ep2017/the-joy-of-pypy-jit/sobel/main.py
+++ b/talk/ep2017/the-joy-of-pypy-jit/sobel/main.py
@@ -6,7 +6,7 @@
 from mplayer import mplayer, view
 from math import sqrt
 import array
-import v0, v1, v2, v3
+import v0, v1, v2, v3, v4, v5
 
 def main(argv):
     if len(argv) > 1:
@@ -20,6 +20,8 @@
         #out = v1.sobel(img)
         #out = v2.sobel(img)
         #out = v3.sobel(img)
+        #out = v4.sobel(img)
+        #out = v5.sobel(img)
 
         try:
             view(out)
diff --git a/talk/ep2017/the-joy-of-pypy-jit/sobel/v4.py 
b/talk/ep2017/the-joy-of-pypy-jit/sobel/v4.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2017/the-joy-of-pypy-jit/sobel/v4.py
@@ -0,0 +1,40 @@
+import array
+from math import sqrt
+from v2 import Image
+
+class Kernel(object):
+
+    def __init__(self, matrix):
+        self.height = len(matrix)
+        self.width = len(matrix[0])
+        self.matrix = matrix
+
+    def __call__(self, img, x, y):
+        value = 0.0
+        for j, row in enumerate(self.matrix, -(self.height/2)):
+            for i, k in enumerate(row, -(self.width/2)):
+                value += img[x+i, y+j] * k
+        return value
+
+
+Gx = Kernel([[-1.0, 0.0, +1.0],
+             [-2.0, 0.0, +2.0],
+             [-1.0, 0.0, +1.0]])
+
+Gy = Kernel([[-1.0, -2.0, -1.0],
+             [0.0,  0.0,  0.0],
+             [+1.0, +2.0, +1.0]])
+
+def sobel(img):
+    """
+    Like v3, but with a generic Kernel class
+    """
+    img = Image(*img)
+    out = Image(img.width, img.height)
+    for y in xrange(1, img.height-1):
+        for x in xrange(1, img.width-1):
+            dx = Gx(img, x, y)
+            dy = Gy(img, x, y)
+            value = min(int(sqrt(dx*dx + dy*dy) / 2.0), 255)
+            out[x, y] = value
+    return out
diff --git a/talk/ep2017/the-joy-of-pypy-jit/sobel/v5.py 
b/talk/ep2017/the-joy-of-pypy-jit/sobel/v5.py
new file mode 100644
--- /dev/null
+++ b/talk/ep2017/the-joy-of-pypy-jit/sobel/v5.py
@@ -0,0 +1,42 @@
+import array
+from math import sqrt
+from v2 import Image
+from pypytools.codegen import Code
+
+def Kernel(matrix):
+    height = len(matrix)
+    width = len(matrix[0])
+    code = Code()
+    with code.block('def apply(img, x, y):'):
+        code.w('value = 0.0')
+        for j, row in enumerate(matrix, -(height/2)):
+            for i, k in enumerate(row, -(width/2)):
+                if k == 0:
+                    continue
+                code.w('value += img[x+{i}, y+{j}] * {k}', i=i, j=j, k=k)
+        code.w('return value')
+    #
+    code.compile()
+    return code['apply']
+
+Gx = Kernel([[-1.0, 0.0, +1.0],
+             [-2.0, 0.0, +2.0],
+             [-1.0, 0.0, +1.0]])
+
+Gy = Kernel([[-1.0, -2.0, -1.0],
+             [0.0,  0.0,  0.0],
+             [+1.0, +2.0, +1.0]])
+
+def sobel(img):
+    """
+    Like v3, but with a generic Kernel class
+    """
+    img = Image(*img)
+    out = Image(img.width, img.height)
+    for y in xrange(1, img.height-1):
+        for x in xrange(1, img.width-1):
+            dx = Gx(img, x, y)
+            dy = Gy(img, x, y)
+            value = min(int(sqrt(dx*dx + dy*dy) / 2.0), 255)
+            out[x, y] = value
+    return out
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to