{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "from array import array\n", "import numpy as np\n", "from timeit import timeit\n", "from multiprocessing import shared_memory" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def console(*msg):\n", " print(*msg)\n", " sys.stdout.flush()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def test(size):\n", " data = [1 for i in range(size)]\n", " \n", " dataA = array('I', [1 for i in range(size)])\n", " byteSize = 4 * size\n", " shmA1 = shared_memory.SharedMemory(create=True, name=f\"dataA{size}\", size=byteSize)\n", " bufA1 = shmA1.buf\n", " bufA1[0:byteSize] = array(\"I\", data).tobytes()\n", " dataA1 = bufA1.cast(\"I\")\n", " \n", " shmA2 = shared_memory.SharedMemory(name=f\"dataA{size}\")\n", " bufA2 = shmA2.buf\n", " dataA2 = bufA2.cast('I')\n", " \n", " dataN = np.array([1 for i in range(size)])\n", " byteSize = dataN.nbytes\n", " shmN1 = shared_memory.SharedMemory(create=True, name=f\"dataN{size}\", size=byteSize)\n", " bufN1 = shmN1.buf\n", " dataN1 = np.ndarray(dataN.shape, dtype=dataN.dtype, buffer=bufN1)\n", " dataN1[:] = dataN[:]\n", " \n", " shmN2 = shared_memory.SharedMemory(name=f\"dataN{size}\")\n", " bufN2 = shmN2.buf\n", " dataN2 = np.ndarray(dataN.shape, dtype=dataN.dtype, buffer=bufN2)\n", " \n", " half = size // 2\n", " \n", " dataA1[half] = 1000\n", " dataN1[half] = 1000\n", "\n", " console(f\"{dataA1[half]} == {dataA2[half]} ? {dataA1[half] == dataA2[half]}\")\n", " console(f\"{dataN1[half]} == {dataN2[half]} ? {dataN1[half] == dataN2[half]}\")\n", "\n", " \n", " console(f'''list : {timeit(\"max(data)\", globals=locals(), number=1):>.3e}''')\n", " console(f'''array : {timeit(\"max(dataA)\", globals=locals(), number=1):>.3e}''')\n", " console(f'''array1 : {timeit(\"max(dataA1)\", globals=locals(), number=1):>.3e}''')\n", " console(f'''array2 : {timeit(\"max(dataA2)\", globals=locals(), number=1):>.3e}''')\n", " console(f'''numpy1 : {timeit(\"max(dataN1)\", globals=locals(), number=1):>.3e}''')\n", " console(f'''numpy2 : {timeit(\"max(dataN2)\", globals=locals(), number=1):>.3e}''')\n", "\n", "\n", " dataA1.release()\n", " dataA2.release()\n", " bufA1.release()\n", " shmA1.close()\n", " shmA2.close()\n", " shmA1.unlink()\n", " bufN1.release()\n", " bufN2.release()\n", " shmN1.close()\n", " shmN2.close()\n", " shmN1.unlink()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 == 1000 ? True\n", "1000 == 1000 ? True\n", "list : 1.505e-02\n", "array : 1.789e-02\n", "array1 : 2.230e-02\n", "array2 : 2.371e-02\n", "numpy1 : 1.044e-01\n", "numpy2 : 1.078e-01\n" ] } ], "source": [ "test(1000000)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.3" } }, "nbformat": 4, "nbformat_minor": 4 }