Author: Antonio Cuni <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit