{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ ":sns" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "require 'matplotlib/iruby'\n", "Matplotlib::IRuby.activate\n", "\n", "require 'pycall/import'\n", "include PyCall::Import\n", "\n", "pyimport :pandas, as: :pd\n", "pyimport :seaborn, as: :sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "require 'benchmark'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 100_000\n", "trials = 100\n", "array = Array.new(n) { rand }\n", "enum = array.each\n", "method = []\n", "runtime = []" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Array#sum\n", "trials.times do\n", " method << 'array.sum'\n", " runtime << Benchmark.realtime { array.sum }\n", "end" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Array#sum\n", "trials.times do\n", " method << 'enum.sum'\n", " runtime << Benchmark.realtime { enum.sum }\n", "end" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Array#inject\n", "trials.times do\n", " method << 'array.inject'\n", " runtime << Benchmark.realtime { array.inject :+ }\n", "end" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Enumerable#inject\n", "trials.times do\n", " method << 'enum.inject'\n", " runtime << Benchmark.realtime { enum.inject :+ }\n", "end" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# while\n", "def while_sum(array)\n", " sum, i, cnt = 0, 0, array.length\n", " while i < cnt\n", " sum += array[i]\n", " i += 1\n", " end\n", " sum\n", "end\n", "\n", "trials.times do\n", " method << 'while'\n", " runtime << Benchmark.realtime { while_sum(array) }\n", "end" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ " runtime\n", "method \n", "array.inject count 100.000000\n", " mean 0.003378\n", " std 0.000597\n", " min 0.002945\n", " 25% 0.003054\n", " 50% 0.003156\n", " 75% 0.003540\n", " max 0.007732\n", "array.sum count 100.000000\n", " mean 0.000686\n", " std 0.000185\n", " min 0.000502\n", " 25% 0.000557\n", " 50% 0.000644\n", " 75% 0.000763\n", " max 0.001398\n", "enum.inject count 100.000000\n", " mean 0.005062\n", " std 0.001402\n", " min 0.004181\n", " 25% 0.004265\n", " 50% 0.004588\n", " 75% 0.005379\n", " max 0.012665\n", "enum.sum count 100.000000\n", " mean 0.001550\n", " std 0.000634\n", " min 0.001276\n", " 25% 0.001300\n", " 50% 0.001389\n", " 75% 0.001546\n", " max 0.006696\n", "while count 100.000000\n", " mean 0.003454\n", " std 0.000500\n", " min 0.003139\n", " 25% 0.003196\n", " 50% 0.003250\n", " 75% 0.003606\n", " max 0.006527" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame.({method: method, runtime: runtime}, {}) # The last empty hash is for empty kwargs\n", "df.groupby.('method').describe.()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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bkROTg78/f0BAOHh4ahduzbCwsIAAEOGDEFQUBDWr1+PTp06ISEhAVevXsWcOXMAACKRCEOGDMHKlSvRqFEj2NraYtmyZbCxsYG3tzcA4MKFC7h06RI8PDxQrVo1XLhwAfPnz0fPnj1hYWGhmyeCiIiIiHSiUoRiHx8fPHv2DNHR0UhNTYWjoyPWrl0rnw7x6NEjiMX/P6jt5uaGRYsWYenSpfj222/RuHFjfPfdd5BIJPI+I0aMQE5ODiIjI5GRkQF3d3esXbsWJiYmAF6PUCckJGDFihWQSqWwtbVFcHCwwjxjIiIiItIPIkEQOCG2DFJTM3VdAhER6cD7cEe7c3/+KP/ZvVkv1DCvq8OKSo93tKOSWFubldhH53OKiYiIiIh0jaGYiIiIiPQeQzERERER6T2GYiIiIiLSewzFREREekQQZMjITkXWS8WbZr3MeQ5B4E0wSH9VikuyERERkfbJZAU4d+1HZGSnKC27fvc4klOuw715L4jFBjqojki3OFJMRESkJ3LyMlUG4kIZ2SnIyeOlRkk/MRQTERHpiaomZjCvZlPscvNqNqhqUvL1XIneR5w+QUREpCfEYgN85NQbmS/TICvIh0yQIU/6EibGpjA0NIaZqSVEIo6XkX5iKCYiItIjIpEY5tWsdV0GUaXDPweJiIiISO8xFBMRERGR3mMoJiIiIiK9x1BMRERERHqPoZiIiIiI9B5DMRERERHpPYZiIiIiItJ7DMVEREREpPcYiomIiIhI7zEUExEREZHeYygmIiIiIr3HUExEREREeo+hmIiIiIj0HkMxEREREek9hmIiIiIi0nsMxURERESk9xiKiYiIiEjvMRQTERERkd5jKCYiIiIivcdQTERERER6j6GYiIiIiPQeQzERERER6T2GYiIiIiLSewzFRERERKT3GIqJiIiISO8xFBMRERGR3mMoJiIiIiK9x1BMRERERHqPoZiIiIiI9B5DMRERERHpPYZiIiIiItJ7DMVEREREpPcYiomIiIhI7zEUExEREZHeYygmIiIiIr3HUExEREREeo+hmIiIiIj0HkMxEREREek9hmIiIiIi0nsMxURERESk9xiKiYiIiEjvMRQTERERkd5jKCYiIiIivcdQTERERER6j6GYiIiIiPQeQzERERER6T2GYiIiIiLSewzFRERERKT3GIqJiIiISO8xFBMR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M8hKvgZr1ceQ8W4xERERlVFl7/YelThNTqbeQJwv72kKNDmZJVgRERERUfFiKKbXMjGvBNMK1V653rRCNZiYVyrBioiIiIiKF6dP0GvJ5CawbtAdeVlpELR5ELRaaHOzIDcrD7mpOUzLW5fJOcVERERE+RiKqVBkMjnM/uVuMREREVFZxtt7RERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHkMxUREREQkeQzFRERERCR5DMVEREREJHmlJhTv3r0b7u7ucHR0RP/+/XH58uV/7X/48GF07doVjo6O6NGjB06dOqWzXhAErF69Gq1bt8ZHH32E4cOHIz4+XqfPw4cPMWXKFDRu3Biurq6YPXs2njx5UtyHRkRERESlXKkIxYcOHcLSpUsxfvx4hISEoEGDBhg5ciRSU1P19r9w4QKmTJmCfv36ITQ0FB06dMD48eNx/fp1sc/mzZuxc+dOLFy4EPv27UP58uUxcuRIZGdni32mTp2KmzdvIjg4GN988w3Onz+P+fPnG/x4iYiIiKh0KRWhODg4GAMGDEDfvn1Rr149LFq0CBYWFjhw4IDe/jt27ECbNm0watQo2NnZwdfXFw0bNsSuXbsAPL9LvGPHDowbNw4dO3ZEgwYN4O/vj6SkJBw/fhwAcOvWLURGRsLPzw9OTk5wdXXF3LlzERERgQcPHpTYsRMRERGR8Rk9FOfk5CA2NhZqtVpsk8vlUKvViImJ0Tvm4sWLaNmypU5b69atcfHiRQBAYmIikpOTdbZpaWkJJycncZsxMTGoXLkyHB0dxT5qtRpyufy1UzeIiIiI6N1iauwC0tPTodFoYGNj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", "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sns.barplot.(x: 'method', y: 'runtime', data: df, errwidth: 2.5, capsize: 0.04)\n", "plt = Matplotlib::Pyplot\n", "plt.title(\"Array and Enumerable summation benchmark (#{trials} trials)\")\n", "plt.xlabel(\"Summation method\")\n", "plt.ylabel(\"Average runtime [sec]\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.4.0", "language": "ruby", "name": "ruby" }, "language_info": { "file_extension": ".rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.4.0" } }, "nbformat": 4, "nbformat_minor": 2 }