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