[pypy-dev] [pypy-svn] r76268 - pypy/branch/micronumpy/pypy/tool

Maciej Fijalkowski fijall at gmail.com
Sun Jul 18 18:36:24 CEST 2010


Benchmarks generally should go to pypy/benchmarks directory in the
main source tree (that is svn+ssh://codespeak.net/svn/pypy/benchmarks)

On Sat, Jul 17, 2010 at 12:41 AM,  <dan at codespeak.net> wrote:
> Author: dan
> Date: Sat Jul 17 00:41:02 2010
> New Revision: 76268
>
> Added:
>   pypy/branch/micronumpy/pypy/tool/convolve.py
> Modified:
>   pypy/branch/micronumpy/pypy/tool/numpybench.py
> Log:
> Oops, I forgot the most important part of the benchmark!
>
> Added: pypy/branch/micronumpy/pypy/tool/convolve.py
> ==============================================================================
> --- (empty file)
> +++ pypy/branch/micronumpy/pypy/tool/convolve.py        Sat Jul 17 00:41:02 2010
> @@ -0,0 +1,43 @@
> +from __future__ import division
> +from __main__ import numpy as np
> +
> +def naive_convolve(f, g):
> +    # f is an image and is indexed by (v, w)
> +    # g is a filter kernel and is indexed by (s, t),
> +    #   it needs odd dimensions
> +    # h is the output image and is indexed by (x, y),
> +    #   it is not cropped
> +    if g.shape[0] % 2 != 1 or g.shape[1] % 2 != 1:
> +        raise ValueError("Only odd dimensions on filter supported")
> +    # smid and tmid are number of pixels between the center pixel
> +    # and the edge, ie for a 5x5 filter they will be 2.
> +    #
> +    # The output size is calculated by adding smid, tmid to each
> +    # side of the dimensions of the input image.
> +    vmax = f.shape[0]
> +    wmax = f.shape[1]
> +    smax = g.shape[0]
> +    tmax = g.shape[1]
> +    smid = smax // 2
> +    tmid = tmax // 2
> +    xmax = vmax + 2*smid
> +    ymax = wmax + 2*tmid
> +    # Allocate result image.
> +    h = np.zeros([xmax, ymax], dtype=f.dtype)
> +    # Do convolution
> +    for x in range(xmax):
> +        for y in range(ymax):
> +            # Calculate pixel value for h at (x,y). Sum one component
> +            # for each pixel (s, t) of the filter g.
> +            s_from = max(smid - x, -smid)
> +            s_to = min((xmax - x) - smid, smid + 1)
> +            t_from = max(tmid - y, -tmid)
> +            t_to = min((ymax - y) - tmid, tmid + 1)
> +            value = 0
> +            for s in range(s_from, s_to):
> +                for t in range(t_from, t_to):
> +                    v = x - smid + s
> +                    w = y - tmid + t
> +                    value += g[smid - s, tmid - t] * f[v, w]
> +            h[x, y] = value
> +    return h
>
> Modified: pypy/branch/micronumpy/pypy/tool/numpybench.py
> ==============================================================================
> --- pypy/branch/micronumpy/pypy/tool/numpybench.py      (original)
> +++ pypy/branch/micronumpy/pypy/tool/numpybench.py      Sat Jul 17 00:41:02 2010
> @@ -21,13 +21,29 @@
>     return numpy.array(kernel)
>
>  if __name__ == '__main__':
> -    from sys import argv as args
> -    width, height, kwidth, kheight = [int(x) for x in args[1:]]
> +    from optparse import OptionParser
> +
> +    option_parser = OptionParser()
> +    option_parser.add_option('--kernel-size', dest='kernel', default='3x3',
> +                             help="The size of the convolution kernel, given as WxH. ie 3x3"
> +                                  "Note that both dimensions must be odd.")
> +    option_parser.add_option('--image-size', dest='image', default='256x256',
> +                             help="The size of the image, given as WxH. ie. 256x256")
> +    option_parser.add_option('--runs', '--count', dest='count', default=1000,
> +                             help="The number of times to run the convolution filter")
> +
> +    options, args = option_parser.parse_args()
> +
> +    def parse_dimension(arg):
> +        return [int(s.strip()) for s in arg.split('x')]
> +
> +    width, height = parse_dimension(options.image)
> +    kwidth, kheight = parse_dimension(options.kernel)
> +    count = int(options.count)
>
>     image = generate_image(width, height)
>     kernel = generate_kernel(kwidth, kheight)
>
>     from timeit import Timer
>     convolve_timer = Timer('naive_convolve(image, kernel)', 'from convolve import naive_convolve; from __main__ import image, kernel; gc.enable()')
> -    count = 100
>     print "%.5f sec/pass" % (convolve_timer.timeit(number=count)/count)
> _______________________________________________
> pypy-svn mailing list
> pypy-svn at codespeak.net
> http://codespeak.net/mailman/listinfo/pypy-svn
>



More information about the Pypy-dev mailing list