{ "cells": [ { "cell_type": "markdown", "id": "ae0a86a6", "metadata": {}, "source": [ "# Nonzero\n", "Here we compare performance of [`nonzero`](https://numpy.org/doc/stable/reference/generated/numpy.nonzero.html#numpy.nonzero) implemented in [numpy](https://numpy.org) and clEsperanto.\n", "\n", "**Note:** benchmarking results vary heavily depending on image size, kernel size, used operations, parameters and used hardware. Use this notebook to adapt it to your use-case scenario and benchmark on your target hardware. If you have different scenarios or use-cases, you are very welcome to submit your notebook as pull-request!" ] }, { "cell_type": "code", "execution_count": 1, "id": "dd6602e6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pyclesperanto_prototype as cle\n", "import numpy as np\n", "import timeit\n", "\n", "# to measure kernel execution duration properly, we need to set this flag. It will slow down exection of workflows a bit though\n", "cle.set_wait_for_kernel_finish(True)\n", "\n", "# selet a GPU with the following in the name. This will fallback to any other GPU if none with this name is found\n", "cle.select_device('RTX')" ] }, { "cell_type": "code", "execution_count": 2, "id": "1711d779", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "image = np.random.random((1024, 1024)) > 0.75\n", "cle.imshow(image)" ] }, { "cell_type": "code", "execution_count": 3, "id": "e064cecb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(numpy.ndarray, (1024, 1024))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(image), image.shape" ] }, { "cell_type": "code", "execution_count": 4, "id": "243315f2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(pyclesperanto_prototype._tier0._pycl.OCLArray, (1024, 1024))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cl_image = cle.push(image)\n", "\n", "type(cl_image), cl_image.shape" ] }, { "cell_type": "code", "execution_count": 5, "id": "e58da326", "metadata": {}, "outputs": [], "source": [ "def numpy_nonzero():\n", " return np.nonzero(image)" ] }, { "cell_type": "code", "execution_count": 6, "id": "abbc2824", "metadata": {}, "outputs": [], "source": [ "def cle_nonzero():\n", " return cle.spots_to_pointlist(cl_image)" ] }, { "cell_type": "code", "execution_count": 7, "id": "b135b3e2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.18 ms ± 133 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "%timeit numpy_nonzero()" ] }, { "cell_type": "code", "execution_count": 8, "id": "ed474299", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34.2 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%timeit cle_nonzero()" ] }, { "cell_type": "code", "execution_count": null, "id": "16b32b87", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }