From 769c1bd6c05f3734044762c9efe3c65ef22cddbd Mon Sep 17 00:00:00 2001 From: Ray Bell Date: Thu, 14 Mar 2024 14:01:31 -0400 Subject: [PATCH] DOC: use constants in performance-comparisons.ipynb (#15215) I've simplified the performance comparisons notebook by setting constants which can be adjusted at the top of each section e.g. `num_rows`. This makes it easier for anyone running this to adjust the value and hopefully not encounter memory values. It can also help with testing these benchmarks on dataframes of various lengths. I've stripped the output as I was working on a A10G and I couldn't run with the current `num_rows` value. I also didn't want to commit the results which may differ compared to the H100 which is used currently and I would rather the results be committed by the RAPIDS team. I can confirm the notebook runs end-to-end (you can see my version here: https://github.com/raybellwaves/cudf-performance-comparisons/blob/main/performance-comparisons.ipynb with smaller `num_rows` and smaller `timeit_number` on a A10G (EC2 machine)) Authors: - Ray Bell (https://github.com/raybellwaves) - GALI PREM SAGAR (https://github.com/galipremsagar) Approvers: - Matthew Roeschke (https://github.com/mroeschke) URL: https://github.com/rapidsai/cudf/pull/15215 --- .../performance-comparisons.ipynb | 754 ++++++++++-------- 1 file changed, 423 insertions(+), 331 deletions(-) diff --git a/docs/cudf/source/user_guide/performance-comparisons/performance-comparisons.ipynb b/docs/cudf/source/user_guide/performance-comparisons/performance-comparisons.ipynb index d06c720494e..d9df99bf16a 100644 --- a/docs/cudf/source/user_guide/performance-comparisons/performance-comparisons.ipynb +++ b/docs/cudf/source/user_guide/performance-comparisons/performance-comparisons.ipynb @@ -26,7 +26,15 @@ "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cudf.__version__='24.04.00'\n" + ] + } + ], "source": [ "import os\n", "import time\n", @@ -37,7 +45,9 @@ "import numpy as np\n", "import pandas as pd\n", "\n", - "import cudf" + "import cudf\n", + "\n", + "print(f\"{cudf.__version__=}\")" ] }, { @@ -63,6 +73,17 @@ { "cell_type": "code", "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "timeit_number = 30\n", + "num_rows = 300_000_000\n", + "sub_sample = int(num_rows / 30)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": { "tags": [] }, @@ -170,13 +191,12 @@ "[300000000 rows x 2 columns]" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "num_rows = 300_000_000\n", "pdf = pd.DataFrame(\n", " {\n", " \"numbers\": np.random.randint(-1000, 1000, num_rows, dtype=\"int64\"),\n", @@ -190,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": { "tags": [] }, @@ -298,7 +318,7 @@ "[300000000 rows x 2 columns]" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -310,7 +330,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "tags": [] }, @@ -334,54 +354,58 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": { "tags": [] }, "outputs": [], "source": [ "pandas_value_counts, cudf_value_counts = timeit_pandas_cudf(\n", - " pdf, gdf, lambda df: df.value_counts(), number=30\n", + " pdf, gdf, lambda df: df.value_counts(), number=timeit_number\n", ")" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": { "tags": [] }, "outputs": [], "source": [ - "pdf = pdf.head(100_000_000)\n", - "gdf = gdf.head(100_000_000)" + "pdf = pdf.head(sub_sample)\n", + "gdf = gdf.head(sub_sample)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": { "tags": [] }, "outputs": [], "source": [ - "pandas_concat = timeit.timeit(lambda: pd.concat([pdf, pdf, pdf]), number=30)" + "pandas_concat = timeit.timeit(\n", + " lambda: pd.concat([pdf, pdf, pdf]), number=timeit_number\n", + ")" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": { "tags": [] }, "outputs": [], "source": [ - "cudf_concat = timeit.timeit(lambda: cudf.concat([gdf, gdf, gdf]), number=30)" + "cudf_concat = timeit.timeit(\n", + " lambda: cudf.concat([gdf, gdf, gdf]), number=timeit_number\n", + ")" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": { "tags": [] }, @@ -391,24 +415,25 @@ " pdf,\n", " gdf,\n", " lambda df: df.groupby(\"business\").agg([\"min\", \"max\", \"mean\"]),\n", - " number=30,\n", + " number=timeit_number,\n", ")" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 16, "metadata": { "tags": [] }, "outputs": [], "source": [ - "num_rows = 1_000_000\n", "pdf = pd.DataFrame(\n", " {\n", - " \"numbers\": np.random.randint(-1000, 1000, num_rows, dtype=\"int64\"),\n", + " \"numbers\": np.random.randint(\n", + " -1000, 1000, int(sub_sample / 10), dtype=\"int64\"\n", + " ),\n", " \"business\": np.random.choice(\n", - " [\"McD\", \"Buckees\", \"Walmart\", \"Costco\"], size=num_rows\n", + " [\"McD\", \"Buckees\", \"Walmart\", \"Costco\"], size=int(sub_sample / 10)\n", " ),\n", " }\n", ")\n", @@ -417,41 +442,20 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 17, "metadata": { "tags": [] }, "outputs": [], "source": [ "pandas_merge, cudf_merge = timeit_pandas_cudf(\n", - " pdf, gdf, lambda df: df.merge(df), number=30\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "performance_df = pd.DataFrame(\n", - " {\n", - " \"cudf speedup vs. pandas\": [\n", - " pandas_value_counts / cudf_value_counts,\n", - " pandas_concat / cudf_concat,\n", - " pandas_groupby / cudf_groupby,\n", - " pandas_merge / cudf_merge,\n", - " ],\n", - " },\n", - " index=[\"value_counts\", \"concat\", \"groupby\", \"merge\"],\n", + " pdf, gdf, lambda df: df.merge(df), number=10\n", ")" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 18, "metadata": { "tags": [] }, @@ -483,19 +487,19 @@ " \n", " \n", " value_counts\n", - " 282.901300\n", + " 168.465151\n", " \n", " \n", " concat\n", - " 203.624680\n", + " 29.828922\n", " \n", " \n", " groupby\n", - " 138.495762\n", + " 46.671713\n", " \n", " \n", " merge\n", - " 136.519031\n", + " 45.633230\n", " \n", " \n", "\n", @@ -503,31 +507,62 @@ ], "text/plain": [ " cudf speedup vs. pandas\n", - "value_counts 282.901300\n", - "concat 203.624680\n", - "groupby 138.495762\n", - "merge 136.519031" + "value_counts 168.465151\n", + "concat 29.828922\n", + "groupby 46.671713\n", + "merge 45.633230" ] }, - "execution_count": 14, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "performance_df = pd.DataFrame(\n", + " {\n", + " \"cudf speedup vs. pandas\": [\n", + " pandas_value_counts / cudf_value_counts,\n", + " pandas_concat / cudf_concat,\n", + " pandas_groupby / cudf_groupby,\n", + " pandas_merge / cudf_merge,\n", + " ],\n", + " },\n", + " index=[\"value_counts\", \"concat\", \"groupby\", \"merge\"],\n", + ")\n", "performance_df" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "tags": [] - }, + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def performance_plot(df, xlabel=None):\n", + " # ylim is 20% above max value\n", + " ylim_max = df[\"cudf speedup vs. pandas\"].max() + (\n", + " df[\"cudf speedup vs. pandas\"].max() / 20\n", + " )\n", + " ax = df.plot.bar(\n", + " color=\"#7400ff\",\n", + " ylim=(1, ylim_max),\n", + " rot=0,\n", + " xlabel=xlabel,\n", + " ylabel=\"Speedup factor\",\n", + " )\n", + " ax.bar_label(ax.containers[0], fmt=\"%.0f\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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+m3fvh2PHj0q8dmWr4Jyhx1HR0ecPHkSGRkZsLKyKjZy8uOPP75yJzwREVWlmJgYdOnSRXo9ceJEAEBgYCBWrlyJa9euYf369fj3339hb2+PNm3a4OTJk2jSpAkAwNTUFHv37sVnn30Gf39/ZGVlwcvLC+vXr8ebb75pkG0i/Xp6JO9pa9asQd++feHo6GiAqgxP58dFqNXqEtufvrMxERHp3/NGw3/66afnLsPb2xs7duzQZ1lUSSo6klfkxo0bOHHiBPbu3VvVm1Bt6Bx2iIiIqPJVdCSvyPfff4+aNWvqfKqJnChEWf9NeEVkZmZCrVYjIyMDNjY2Vb7+KaXf/1DW5r+iP3nc368W7m+iylPev9/V/tlYRERERBXBw1hERER6wpG86okjO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkawYNOydOnIC/vz/c3NygUCiwc+dOrflCCISFhcHNzQ0qlQqdO3fGH3/8odVHo9Fg3LhxcHBwgKWlJfr27Yu7d+9W4VYQERFRdWbQsJOdnY3mzZsjIiKixPnz5s3DwoULERERgfPnz8PFxQU9evTAw4cPpT4hISGIiopCZGQkTp06haysLPTp0wcFBQVVtRlERERUjZkYcuV+fn7w8/MrcZ4QAosXL8a0adMwcOBAAMD69evh7OyMzZs3Y8SIEcjIyMCaNWvwww8/oHv37gCAjRs3wt3dHYcPH0avXr2qbFuIiIioeqq25+wkJSUhNTUVPXv2lNqUSiU6deqE06dPAwBiY2ORl5en1cfNzQ0+Pj5Sn5JoNBpkZmZqTURERCRP1TbspKamAgCcnZ212p2dnaV5qampMDMzg62tbal9ShIeHg61Wi1N7u7ueq6eiIiIqotqG3aKKBQKrddCiGJtz3pen9DQUGRkZEhTcnKyXmolIiKi6qfahh0XFxcAKDZCk5aWJo32uLi4IDc3F+np6aX2KYlSqYSNjY3WRERERPJUbcOOp6cnXFxccOjQIaktNzcXx48fh6+vLwCgVatWMDU11eqTkpKCy5cvS32IiIjo1WbQq7GysrJw48YN6XVSUhLi4uJgZ2eH2rVrIyQkBHPmzIG3tze8vb0xZ84cWFhYYPDgwQAAtVqN4OBgTJo0Cfb29rCzs8PkyZPRtGlT6eosIiIierUZNOzExMSgS5cu0uuJEycCAAIDA7Fu3TpMnToVOTk5GD16NNLT09G2bVscPHgQ1tbW0nsWLVoEExMTDBo0CDk5OejWrRvWrVsHY2PjKt8eIiIiqn4UQghh6CIMLTMzE2q1GhkZGQY5f2dK2edby9b8V/Qnj/v71cL9/Wrh/q5a5f37XW3P2SEiIiLSB4YdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikrVqHXbCwsKgUCi0JhcXF2m+EAJhYWFwc3ODSqVC586d8ccffxiwYiIiIqpuqnXYAYAmTZogJSVFmuLj46V58+bNw8KFCxEREYHz58/DxcUFPXr0wMOHDw1YMREREVUn1T7smJiYwMXFRZocHR0BPBnVWbx4MaZNm4aBAwfCx8cH69evx6NHj7B582YDV01ERETVRbUPO9evX4ebmxs8PT3x7rvv4tatWwCApKQkpKamomfPnlJfpVKJTp064fTp02UuU6PRIDMzU2siIiIiearWYadt27bYsGEDDhw4gNWrVyM1NRW+vr64d+8eUlNTAQDOzs5a73F2dpbmlSY8PBxqtVqa3N3dK20biIiIyLCqddjx8/PD22+/jaZNm6J79+7Ys2cPAGD9+vVSH4VCofUeIUSxtmeFhoYiIyNDmpKTk/VfPBEREVUL1TrsPMvS0hJNmzbF9evXpauynh3FSUtLKzba8yylUgkbGxutiYiIiOTppQo7Go0GV69ehaurKzw9PeHi4oJDhw5J83Nzc3H8+HH4+voasEoiIiKqTkwMXUBZJk+eDH9/f9SuXRtpaWmYNWsWMjMzERgYCIVCgZCQEMyZMwfe3t7w9vbGnDlzYGFhgcGDBxu6dCIiIqomqnXYuXv3Lt577z38+++/cHR0RLt27XD27Fl4eHgAAKZOnYqcnByMHj0a6enpaNu2LQ4ePAhra2sDV05ERETVRbUOO5GRkWXOVygUCAsLQ1hYWNUURERERC+dl+qcHSIiIiJdMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrJkYuoDqQAgBAMjMzDTI+jUGWavhGejjNjju71cL9/erhfu7qtf7ZMVFf8dLoxDP6/EKuHv3Ltzd3Q1dBhEREb2A5ORk1KpVq9T5DDsACgsL8ffff8Pa2hoKhcLQ5VSZzMxMuLu7Izk5GTY2NoYuhyoZ9/erhfv71fKq7m8hBB4+fAg3NzcYGZV+Zg4PYwEwMjIqMxHKnY2NzSv15XjVcX+/Wri/Xy2v4v5Wq9XP7cMTlImIiEjWGHaIiIhI1hh2XmFKpRIzZsyAUqk0dClUBbi/Xy3c368W7u+y8QRlIiIikjWO7BAREZGsMewQERGRrDHsEBERkawx7FQzderUweLFiw1dBhG9gqKjo6FQKPDgwQNDl0KkVww7ZHC3b9+GQqFAXFycoUuhcgoKCkL//v0NXQYRUbkw7BARVWO5ubmGLoFeUvzZ+T8MO3r03XffoWbNmigsLNRq79u3LwIDA3Hz5k3069cPzs7OsLKyQps2bXD48OFSl1fSiMeDBw+gUCgQHR0ttV25cgVvvvkmrKys4OzsjKFDh+Lff/8tV82FhYWYO3cuvLy8oFQqUbt2bcyePVuaHx8fj65du0KlUsHe3h4ff/wxsrKypPmdO3dGSEiI1jL79++PoKAg6XWdOnUwZ84cDBs2DNbW1qhduzZWrVolzff09AQAtGzZEgqFAp07dwbwZEj99ddfh6WlJWrUqIE33ngDf/75Z7m262VX1n553j4pGnX55ptv4OrqCnt7e4wZMwZ5eXlSH41Gg6lTp8Ld3R1KpRLe3t5Ys2YNAKCgoADBwcHw9PSESqVCgwYN8O2330rvDQsLw/r16/Hzzz9DoVAU+3mksj18+BBDhgyBpaUlXF1dsWjRIq3vUZ06dTBr1iwEBQVBrVZj+PDhAIAdO3agSZMmUCqVqFOnDhYsWKC1XIVCgZ07d2q11ahRA+vWrQPwf79PIiMj4evrC3NzczRp0qTEfffrr7+iefPmMDc3R9u2bREfHw8AyM7Oho2NDbZv367Vf/fu3bC0tMTDhw8r/gG9Ijp37oxx48YhJCQEtra2cHZ2xqpVq5CdnY0PP/wQ1tbWqFevHvbt2ye953m/6zt37oyxY8di4sSJcHBwQI8ePQAAu3btgre3N1QqFbp06YL169cXO1x5+vRpdOzYESqVCu7u7hg/fjyys7Or7POodIL05t69e8LMzEwcPnxYart//74wMzMTBw4cEHFxcWLlypXi0qVLIjExUUybNk2Ym5uLP//8U+rv4eEhFi1aJIQQIikpSQAQFy9elOanp6cLAOLYsWNCCCH+/vtv4eDgIEJDQ8XVq1fFhQsXRI8ePUSXLl3KVfPUqVOFra2tWLdunbhx44Y4efKkWL16tRBCiOzsbOHm5iYGDhwo4uPjxZEjR4Snp6cIDAyU3t+pUycxYcIErWX269dPq4+Hh4ews7MTy5YtE9evXxfh4eHCyMhIXL16VQghxLlz5wQAcfjwYZGSkiLu3bsn8vLyhFqtFpMnTxY3btwQV65cEevWrdP6rOSstP1Snn0SGBgobGxsxMiRI8XVq1fF7t27hYWFhVi1apXUZ9CgQcLd3V389NNP4ubNm+Lw4cMiMjJSCCFEbm6u+PLLL8W5c+fErVu3xMaNG4WFhYXYunWrEEKIhw8fikGDBonevXuLlJQUkZKSIjQaTZV+Pi+zjz76SHh4eIjDhw+L+Ph4MWDAAGFtbS19jzw8PISNjY2YP3++uH79urh+/bqIiYkRRkZG4quvvhIJCQli7dq1QqVSibVr10rLBSCioqK01qVWq6U+Rb9PatWqJbZv3y6uXLkiPvroI2FtbS3+/fdfIYQQx44dEwBEo0aNxMGDB8WlS5dEnz59RJ06dURubq4QQojhw4eLN998U2s9AwYMEB988EGlfF5y1alTJ2FtbS1mzpwpEhMTxcyZM4WRkZHw8/MTq1atEomJiWLUqFHC3t5eZGdnl+t3fadOnYSVlZWYMmWKuHbtmrh69apISkoSpqamYvLkyeLatWtiy5YtombNmgKASE9PF0IIcenSJWFlZSUWLVokEhMTxa+//ipatmwpgoKCDPTp6B/Djp717dtXDBs2THr93XffCRcXF5Gfn19i/8aNG4ulS5dKr3UNO1988YXo2bOn1jKTk5MFAJGQkFBmrZmZmUKpVErh5lmrVq0Stra2IisrS2rbs2ePMDIyEqmpqUKI8oed999/X3pdWFgonJycxIoVK0rdznv37gkAIjo6usxtkKOy9kt59klgYKDw8PDQ+pl75513REBAgBBCiISEBAFAHDp0qNw1jR49Wrz99tvS68DAQNGvXz9dN+2Vl5mZKUxNTcWPP/4otT148EBYWFhohZ3+/ftrvW/w4MGiR48eWm1TpkwRjRs3ll6XN+x8/fXX0vy8vDxRq1YtMXfuXCHE/4WdouArxJPvokqlksLub7/9JoyNjcVff/0lhBDin3/+Eaampq/kd7UiOnXqJDp06CC9zs/PF5aWlmLo0KFSW0pKigAgzpw5U67f9Z06dRItWrTQ6vPpp58KHx8frbZp06ZphZ2hQ4eKjz/+WKvPyZMnhZGRkcjJyanwtlYHPIylZ0OGDMGOHTug0WgAAJs2bcK7774LY2NjZGdnY+rUqWjcuDFq1KgBKysrXLt2DXfu3Hnh9cXGxuLYsWOwsrKSpoYNGwIAbt68WeZ7r169Co1Gg27dupU6v3nz5rC0tJTa3njjDRQWFiIhIUGnOps1ayb9W6FQwMXFBWlpaaX2t7OzQ1BQEHr16gV/f398++23SElJ0WmdL6uy9kt590mTJk1gbGwsvXZ1dZU+77i4OBgbG6NTp06l1rBy5Uq0bt0ajo6OsLKywurVqyv0c0pP3Lp1C3l5eXj99delNrVajQYNGmj1a926tdbrq1ev4o033tBqe+ONN3D9+nUUFBToVEP79u2lf5uYmKB169a4evVqqX3s7OzQoEEDqc/rr7+OJk2aYMOGDQCAH374AbVr10bHjh11qoO0fy8aGxvD3t4eTZs2ldqcnZ0BAGlpaeX+Xf/sz05CQgLatGmj1fb0zx/w5O/IunXrtJbdq1cvFBYWIikpST8ba2Amhi5Abvz9/VFYWIg9e/agTZs2OHnyJBYuXAgAmDJlCg4cOIBvvvkGXl5eUKlU+J//+Z9STyIzMnqSRcVTT/R4+rwL4Mm5Hf7+/pg7d26x97u6upZZq0qlKnO+EAIKhaLEeUXtRkZGWvWVVCMAmJqaFnv/s+c2PWvt2rUYP3489u/fj61bt2L69Ok4dOgQ2rVrV+b7XnZl7Zfy7BOg7M/7eft927Zt+OSTT7BgwQK0b98e1tbWmD9/Pn777bfybgKVoui78uw+fPY79HSYLZr/vPcoFIpyfRdLUtrPVGl9PvroI0REROCzzz7D2rVr8eGHH5ZrGaStpO/p021Fn2lhYWG5f9e/yM9OYWEhRowYgfHjxxdbdu3atcu5NdUbR3b0TKVSYeDAgdi0aRO2bNmC+vXro1WrVgCAkydPIigoCAMGDEDTpk3h4uKC27dvl7osR0dHANAa0Xj28uzXXnsNf/zxB+rUqQMvLy+t6dkf+mcVnbB25MiREuc3btwYcXFxWiep/frrrzAyMkL9+vWlGp+ur6CgAJcvXy5zvc8yMzOT3vusli1bIjQ0FKdPn4aPjw82b96s07JfRmXtl/Lsk+dp2rQpCgsLcfz48RLnnzx5Er6+vhg9ejRatmwJLy+vYqOEZmZmOo8oEFCvXj2Ympri3LlzUltmZiauX79e5vsaN26MU6dOabWdPn0a9evXl0bwnv0uXr9+HY8ePSq2rLNnz0r/zs/PR2xsrDRCUFKf9PR0JCYmavV5//33cefOHSxZsgR//PEHAgMDy6yfKu5Ff9c3bNgQ58+f12qLiYkpcdnPLtfLy0v6/fyyY9ipBEOGDMGePXvw/fff4/3335favby88NNPPyEuLg6///47Bg8eXObohkqlQrt27fD111/jypUrOHHiBKZPn67VZ8yYMbh//z7ee+89nDt3Drdu3cLBgwcxbNiw5/4xMjc3x6effoqpU6diw4YNuHnzJs6ePStdlTNkyBCYm5sjMDAQly9fxrFjxzBu3DgMHTpUGl7t2rUr9uzZgz179uDatWsYPXq0zjckc3Jygkqlwv79+/Hf//4XGRkZSEpKQmhoKM6cOYM///wTBw8eRGJiIho1aqTTsl9GZe2X8uyT56lTpw4CAwMxbNgw7Ny5E0lJSYiOjsa2bdsAPPk5jYmJwYEDB5CYmIgvvvii2C/LOnXq4NKlS0hISMC///5b7hGEV521tTUCAwMxZcoUHDt2DH/88QeGDRsGIyOjMkdGJk2ahCNHjmDmzJlITEzE+vXrERERgcmTJ0t9unbtioiICFy4cAExMTEYOXJksZEDAFi2bBmioqJw7do1jBkzBunp6Rg2bJhWn6+++gpHjhzB5cuXERQUBAcHB637Ktna2mLgwIGYMmUKevbsiVq1alX8w6Eyvejv+hEjRuDatWv49NNPkZiYiG3btklX6BX9zH366ac4c+YMxowZg7i4OFy/fh27du3CuHHjqmLTqoaBzhWStfz8fOHq6ioAiJs3b0rtSUlJokuXLkKlUgl3d3cRERFR7ATfp09QFkKIK1euiHbt2gmVSiVatGghDh48qHWCshBCJCYmigEDBogaNWoIlUolGjZsKEJCQkRhYeFzay0oKBCzZs0SHh4ewtTUVNSuXVvMmTNHmn/p0iXRpUsXYW5uLuzs7MTw4cPFw4cPpfm5ubli1KhRws7OTjg5OYnw8PAST1B+epuEEKJ58+ZixowZ0uvVq1cLd3d3YWRkJDp16iRSU1NF//79haurqzAzMxMeHh7iyy+/FAUFBc/dJjkoa788b5+UdPLwhAkTRKdOnaTXOTk54pNPPpE+Xy8vL/H9998LIYR4/PixCAoKEmq1WtSoUUOMGjVKfPbZZ6J58+bS+9PS0kSPHj2ElZVVsZ9HKltmZqYYPHiwsLCwEC4uLmLhwoXi9ddfF5999pkQouTvixBCbN++XTRu3Fj6eZg/f77W/L/++kv07NlTWFpaCm9vb7F3794ST1DevHmzaNu2rTAzMxONGjUSR44ckZZRdILy7t27RZMmTYSZmZlo06aNiIuLK1bPkSNHBACxbds2/X04r5CSLu4oad/jqRPPn/e7vqRlCiHEzz//LLy8vIRSqRSdO3cWK1asEAC0Tj4+d+6c9J22tLQUzZo1E7Nnz9bnJhuUQohnDt4REVGVyc7ORs2aNbFgwQIEBwdX2npu374NT09PXLx4ES1atKjw8jZt2oQJEybg77//ls2hjlfF7NmzsXLlSiQnJxu6lCrDE5SJiKrQxYsXce3aNbz++uvIyMjAV199BQDo16+fgSsrn0ePHiEpKQnh4eEYMWIEg85LYPny5WjTpg3s7e3x66+/Yv78+Rg7dqyhy6pSPGdHxu7cuaN1KeGzEy8lJjKMb775Bs2bN0f37t2RnZ2NkydPwsHBwdBllcu8efPQokULODs7IzQ01NDlUDlcv34d/fr1Q+PGjTFz5kxMmjQJYWFhhi6rSvEwlozl5+eXebVXnTp1YGLCwT0iIpI3hh0iIiKSNR7GIiIiIllj2CEiIiJZY9ghIiIiWWPYISIiIllj2CEiKkVQUJDWYxKI6OXEsENElS45ORnBwcFwc3ODmZkZPDw8MGHCBNy7d8/QpQF4cndhhUJR7EG73377rfQcISJ6eTHsEFGlunXrFlq3bo3ExERs2bIFN27cwMqVK3HkyBG0b98e9+/fr7R1V/QBpWq1GjVq1NBPMURkMAw7RFSpxowZAzMzMxw8eBCdOnVC7dq14efnh8OHD+Ovv/7CtGnTADy5yeXMmTMxePBgWFlZwc3NDUuXLtVaVkZGBj7++GM4OTnBxsYGXbt2xe+//y7NDwsLQ4sWLfD999+jbt26UCqVEEJg//796NChA2rUqAF7e3v06dMHN2/elN7n6ekJAGjZsiUUCgU6d+4MoPhhLI1Gg/Hjx8PJyQnm5ubo0KGD1hPho6OjoVAocOTIEbRu3RoWFhbw9fVFQkKCvj9WItIBww4RVZr79+/jwIEDGD16NFQqldY8FxcXDBkyBFu3bkXRvU3nz5+PZs2a4cKFCwgNDcUnn3yCQ4cOAQCEEHjrrbeQmpqKvXv3IjY2Fq+99hq6deumNTp048YNbNu2DTt27JAOS2VnZ2PixIk4f/48jhw5AiMjIwwYMACFhYUAgHPnzgEADh8+jJSUFPz0008lbs/UqVOxY8cOrF+/HhcuXICXlxd69epVbHRq2rRpWLBgAWJiYmBiYoJhw4ZV/MMkohdnsOetE5HsnT17VgAQUVFRJc5fuHChACD++9//Cg8PD9G7d2+t+QEBAcLPz08IIcSRI0eEjY2NePz4sVafevXqie+++04IIcSMGTOEqampSEtLK7OutLQ0AUDEx8cLIYRISkoSAMTFixe1+gUGBop+/foJIYTIysoSpqamYtOmTdL83Nxc4ebmJubNmyeEEOLYsWMCgDh8+LDUZ8+ePQKAyMnJKbMmIqo8HNkhIoMR//+IjkKhAAC0b99ea3779u1x9epVAEBsbCyysrJgb2+v9UDbpKQkrUNSHh4ecHR01FrOzZs3MXjwYNStWxc2NjbSYStdHoZ78+ZN5OXl4Y033pDaTE1N8frrr0s1FmnWrJn0b1dXVwBAWlpauddFRPrFp0ASUaXx8vKCQqHAlStXSryE+9q1a7C1tS3zid9FQaiwsBCurq6Ijo4u1ufpk4gtLS2Lzff394e7uztWr14NNzc3FBYWwsfHB7m5ueXelmeD2dPtz7aZmpqWWD8RGQZHdoio0tjb26NHjx5Yvnw5cnJytOalpqZi06ZNCAgIkALB2bNntfqcPXsWDRs2BAC89tprSE1NhYmJCby8vLSmssLSvXv3cPXqVUyfPh3dunVDo0aNkJ6ertXHzMwMAFBQUFDqcry8vGBmZoZTp05JbXl5eYiJiUGjRo3K8WkQkaEw7BBRpYqIiIBGo0GvXr1w4sQJJCcnY//+/ejRowdq1qyJ2bNnS31//fVXzJs3D4mJiVi2bBl+/PFHTJgwAQDQvXt3tG/fHv3798eBAwdw+/ZtnD59GtOnT0dMTEyp67e1tYW9vT1WrVqFGzdu4OjRo5g4caJWHycnJ6hUKuzfvx///e9/kZGRUWw5lpaWGDVqFKZMmYL9+/fjypUrGD58OB49eoTg4GA9fVpEVBkYdoioUnl7eyMmJgb16tVDQEAA6tWrh48//hhdunTBmTNnYGdnJ/WdNGkSYmNj0bJlS8ycORMLFixAr169ADw5HLR371507NgRw4YNQ/369fHuu+/i9u3bcHZ2LnX9RkZGiIyMRGxsLHx8fPDJJ59g/vz5Wn1MTEywZMkSfPfdd3Bzc0O/fv1KXNbXX3+Nt99+G0OHDsVrr72GGzdu4MCBA7C1tdXDJ0VElUUhig5EExEZUJ06dRASEoKQkBBDl0JEMsORHSIiIpI1hh0iIiKSNR7GIiIiIlnjyA4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERydr/B74jPzrSSA7zAAAAAElFTkSuQmCC", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGxCAYAAACEFXd4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPqUlEQVR4nO3dd1QUV/8/8PciVcoiKE1pBqNYQOyo39iIqAliSdSEKCqWGAyxK0/sxmAv2CVGTSIaSzSWBAuxxQ6CQUVARSVR5HlUQFAQ4f7+8Di/bADDysIu4/t1zp7j3Ds7+5ldYN/euTOjEEIIEBEREcmUnrYLICIiIqpIDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQka/raLkAXFBUV4e7duzA3N4dCodB2OURERFQGQgg8fvwYDg4O0NMrffyGYQfA3bt34ejoqO0yiIiI6DWkpaWhTp06pfYz7AAwNzcH8OLNsrCw0HI1REREVBbZ2dlwdHSUvsdLw7ADSIeuLCwsGHaIiIiqmH+bgsIJykRERCRrDDtEREQkaww7MnPixAn4+fnBwcEBCoUCe/bsKbZOYmIievbsCaVSCVNTU7Rs2RJ37tyR+tPT0zFw4EDY2dnB1NQUzZo1w65duypxL4iIiDSHc3ZkJjc3F56enhg6dCj69OlTrP/GjRto3749goKCMGvWLFhYWODKlSswNjaW1hk0aBAyMzOxd+9e1KxZE5GRkejXrx9iYmLg5eVVmbtDpHMKCwtRUFCg7TKI3ggGBgaoVq1aubejEEIIDdRTpWVnZ0OpVCIrK0tWE5QVCgV2796NXr16SW0DBgyAgYEBvv/++1KfZ2ZmhjVr1mDgwIFSm7W1NebPn49hw4ZVZMlEOksIgfT0dGRmZmq7FKI3iqWlJezs7EqchFzW72+O7LxBioqKcODAAUyaNAm+vr6Ii4uDq6srQkNDVQJR27Zt8eOPP+K9996DpaUltm/fjry8PHTs2FFrtRNp28ugY2Njg+rVq/MCpEQVTAiBJ0+eICMjAwBgb2//2tti2HmDZGRkICcnB/PmzcNXX32F+fPnIyoqCn369MHRo0fRoUMHAMD27dvRv39/WFtbQ19fH9WrV8fu3bvh5uam5T0g0o7CwkIp6FhbW2u7HKI3homJCYAX3182NjavfUiLYecNUlRUBADw9/fH2LFjAQBNmzbF6dOnsXbtWinsTJs2DZmZmThy5Ahq1qyJPXv2oF+/fjh58iSaNGmitfqJtOXlHJ3q1atruRKiN8/L37uCggKGHfp3NWvWhL6+Pho2bKjS7u7ujt9//x3AiwnMK1euxOXLl9GoUSMAgKenJ06ePIlVq1Zh7dq1lV43ka7goSuiyqeJ3zueev4GMTQ0RMuWLZGUlKTSnpycDGdnZwDAkydPAKDYDdWqVasmjQwR0Ztt06ZNsLS0VGlbv349HB0doaenh2XLlmmlrtdx69YtKBQKxMfHa7uUKs3FxUWnP3eO7MhMTk4Orl+/Li2npqYiPj4eVlZWcHJywsSJE9G/f3+888476NSpE6KiorBv3z4cO3YMANCgQQO4ublh5MiRWLRoEaytrbFnzx4cPnwY+/fv19JeEZEuy87OxujRo7FkyRL07dsXSqVS2yURqWDYkZmYmBh06tRJWh43bhwAIDAwEJs2bULv3r2xdu1ahIWFISQkBPXr18euXbvQvn17AC+uafDLL79gypQp8PPzQ05ODtzc3LB582b06NFDK/tEpMsmVvKRrYU6eLGQO3fuoKCgAO+99165zpghqig8jCUzHTt2hBCi2GPTpk3SOkOHDkVKSgqePn2K+Ph4+Pv7q2yjXr162LVrF+7fv4/c3FxcunRJ5Zo7RFR1FBUVYcGCBXBzc4ORkRGcnJwwd+5cAMCxY8egUChUrh0UHx8PhUKBW7duSW2bNm2Ck5MTqlevjt69e+PBgwcqfS9PXKhbt26x57707NkzjB49Gvb29jA2NoazszPCwsKkfoVCgTVr1qB79+4wMTFB3bp1sXPnTpVtpKWloV+/frC0tISVlRX8/f2LvdY333wDd3d3GBsbo0GDBli9erVK//nz5+Hl5QVjY2O0aNECcXFxKv0lHaLbs2ePyryRmTNnomnTpli3bh0cHR1RvXp19OvXD1lZWcX2G3jxGdSpUwdr1qxRaY+Li4Oenh5u374NIQRmzpwJJycnGBkZwcHBASEhISVuryQvD8dt27YNbdu2hbGxMRo3bozjx49L6xQWFiIoKAiurq4wMTFB/fr1sXz5cpXtDB48GL169cKiRYtgb28Pa2trBAcHq1xIMyMjA35+fjAxMYGrqyu2bNlSrJ4lS5agSZMmMDU1haOjIz777DPk5ORI/bdv34afnx9q1KgBU1NTNGrUCL/88kuZ91ddDDtERDIWGhqKefPmYdq0abh69SoiIyNha2tb5uefO3cOQUFBGD16NOLj49GpUyd89dVXUn///v1x5MgRAC+CxL179+Do6FhsO+Hh4di7dy+2b9+OpKQkbNmyBS4uLirrTJs2DX379sWlS5cQEBCAAQMGIDExEcCLM3F8fX1hbm6OkydP4tSpUzAzM0O3bt3w7NkzAMCWLVswffp0zJ07F4mJifj6668xbdo0bN68GcCLw/zvv/8+GjZsiNjYWMycORMTJkxQ6/186fr169i+fTv27duHqKgoxMXF4bPPPitxXT09PXz00UeIjIxUad+yZQvatWsHZ2dn7Nq1C0uXLsW6deuQkpKCPXv2vNbZrxMnTsT48eMRFxcHb29v+Pn5SeH0ZejasWMHrl69iunTp+M///kPtm/frrKNo0eP4saNGzh69Cg2b96MTZs2qfyHefDgwUhLS8PRo0exc+dOrF69WroWzt/3OTw8HFeuXMHmzZvx22+/YdKkSVJ/cHAw8vPzceLECSQkJGD+/PkwMzNTe3/LTJDIysoSAERWVpa2SyEiHfT06VNx9epV8fTp02J9E1C5D3VkZ2cLIyMjERERUWL/0aNHBQDx6NEjqS0uLk4AEKmpqUIIIT766CPRo0cPlef1799fKJXKUp9Tks8//1x07txZFBUVldgPQHz66acqba1btxajRo0SQgjx/fffi/r166s8Pz8/X5iYmIiDBw8KIYR46623RGRkpMo25syZI7y9vYUQQqxbt05YW1urfI5r1qwRAERcXJwQQoiNGzeq7JsQQuzevVv8/etyxowZolq1auLPP/+U2n799Vehp6cn7t27V+L+xcXFCYVCIW7fvi2EEKKwsFDUrl1brFmzRgghxOLFi8Xbb78tnj17VuLz/01qaqoAIObNmye1FRQUiDp16oj58+eX+rzg4GDRt29faTkwMFA4OzuL58+fS20ffvih6N+/vxBCiKSkJAFAnD9/XupPTEwUAMTSpUtLfZ0dO3YIa2trablJkyZi5syZZdq3V/3+lfX7m3N2dEBlH/PXFbo494BIThITE5Gfn48uXbqUaxu9e/dWafP29kZUVJRa2xk8eDDeffdd1K9fH926dcP777+Prl27FtvuP5dfniV16dIlXL9+Hebm5irr5OXl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k5MTgBfn348fPx7btm1Dfn4+fH19sXr1atja2mphj4hIjqpVqwZLS0vpYnzVq1eHQvGGXiCLqJIIIfDkyRNkZGTA0tJS5eak6tJq2MnNzYWnpyeGDh2KPn36FOu/ceMG2rdvj6CgIMyaNQsWFha4cuWKykWFxo4diwMHDmDHjh1QKpUYPXo0+vTpg1OnTlXmrhCRzL28DcDLwENElcPS0vKVt+EoC525gnJJV88cMGAADAwM8P3335f4nKysLNSqVQuRkZHS3XOvXbsGd3d3nDlzBm3atCnTa/MKytrBKyhTVVRYWFhhdwYnIlUGBgavHNEp6/e3zl5np6ioCAcOHMCkSZPg6+uLuLg4uLq6IjQ0VApEsbGxKCgogI+Pj/S8Bg0awMnJ6ZVhJz8/H/n5+dJydnZ2he4LEclHtWrVyjWcTkSVT2cnKGdkZCAnJwfz5s1Dt27dcOjQIfTu3Rt9+vTB8ePHAQDp6ekwNDRUuWsuANja2iI9Pb3UbYeFhUGpVEoPR0fHitwVIiIi0iKdDTtFRUUAAH9/f4wdOxZNmzbFlClT8P777xe7Vby6QkNDkZWVJT3S0tI0UTIRERHpIJ09jFWzZk3o6+ujYcOGKu3u7u74/fffAbyYMPjs2TNkZmaqjO7cv3//lZOZjIyMYGRkVCF1ExERkW7R2ZEdQ0NDtGzZEklJSSrtycnJcHZ2BgA0b94cBgYGiI6OlvqTkpJw584deHt7V2q9REREpJu0OrKTk5OD69evS8upqamIj4+HlZUVnJycMHHiRPTv3x/vvPMOOnXqhKioKOzbtw/Hjh0DACiVSgQFBWHcuHGwsrKChYUFPv/8c3h7e5f5TCwiIiKSN62GnZiYGHTq1ElaHjduHAAgMDAQmzZtQu/evbF27VqEhYUhJCQE9evXx65du9C+fXvpOUuXLoWenh769u2rclFBIiIiIkCHrrOjTbzOjnbwOjtERFQeZf3+1tk5O0RERESawLBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssaw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", "text/plain": [ "
" ] @@ -537,20 +572,12 @@ } ], "source": [ - "ax = performance_df.plot.bar(\n", - " color=\"#7400ff\",\n", - " ylim=(1, 400),\n", - " rot=0,\n", - " xlabel=\"Operation\",\n", - " ylabel=\"Speedup factor\",\n", - ")\n", - "ax.bar_label(ax.containers[0], fmt=\"%.0f\")\n", - "plt.show()" + "performance_plot(performance_df, xlabel=\"Operation\")" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 21, "metadata": { "tags": [] }, @@ -573,13 +600,22 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "timeit_number = 20\n", + "num_rows = 300_000_000" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "metadata": { "tags": [] }, "outputs": [], "source": [ - "num_rows = 300_000_000\n", "pd_series = pd.Series(\n", " np.random.choice(\n", " [\"123\", \"56.234\", \"Walmart\", \"Costco\", \"rapids ai\"], size=num_rows\n", @@ -589,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 13, "metadata": { "tags": [] }, @@ -600,64 +636,47 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "metadata": { "tags": [] }, "outputs": [], "source": [ "pandas_upper, cudf_upper = timeit_pandas_cudf(\n", - " pd_series, gd_series, lambda s: s.str.upper(), number=20\n", + " pd_series, gd_series, lambda s: s.str.upper(), number=timeit_number\n", ")" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 15, "metadata": { "tags": [] }, "outputs": [], "source": [ "pandas_contains, cudf_contains = timeit_pandas_cudf(\n", - " pd_series, gd_series, lambda s: s.str.contains(r\"[0-9][a-z]\"), number=20\n", + " pd_series,\n", + " gd_series,\n", + " lambda s: s.str.contains(r\"[0-9][a-z]\"),\n", + " number=timeit_number,\n", ")" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "pandas_isalpha, cudf_isalpha = timeit_pandas_cudf(\n", - " pd_series, gd_series, lambda s: s.str.isalpha(), number=20\n", + " pd_series, gd_series, lambda s: s.str.isalpha(), number=timeit_number\n", ")" ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "performance_df = pd.DataFrame(\n", - " {\n", - " \"cudf speedup vs. pandas\": [\n", - " pandas_upper / cudf_upper,\n", - " pandas_contains / cudf_contains,\n", - " pandas_isalpha / cudf_isalpha,\n", - " ],\n", - " },\n", - " index=[\"upper\", \"contains\", \"isalpha\"],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 23, + "execution_count": 17, "metadata": { "tags": [] }, @@ -689,15 +708,15 @@ " \n", " \n", " upper\n", - " 1832.120875\n", + " 376.502445\n", " \n", " \n", " contains\n", - " 1311.758332\n", + " 405.030084\n", " \n", " \n", - " is_alpha\n", - " 5752.301339\n", + " isalpha\n", + " 1974.166058\n", " \n", " \n", "\n", @@ -705,30 +724,38 @@ ], "text/plain": [ " cudf speedup vs. pandas\n", - "upper 1832.120875\n", - "contains 1311.758332\n", - "is_alpha 5752.301339" + "upper 376.502445\n", + "contains 405.030084\n", + "isalpha 1974.166058" ] }, - "execution_count": 23, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "performance_df = pd.DataFrame(\n", + " {\n", + " \"cudf speedup vs. pandas\": [\n", + " pandas_upper / cudf_upper,\n", + " pandas_contains / cudf_contains,\n", + " pandas_isalpha / cudf_isalpha,\n", + " ],\n", + " },\n", + " index=[\"upper\", \"contains\", \"isalpha\"],\n", + ")\n", "performance_df" ] }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "tags": [] - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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4u7du3o1Li4uaNmypVSzb98+qNVqKQwBQPv27aFWq6WaihQVFSE/P1/vRURERHVTjQYif39/fPvtt9i8eTPi4uKQnZ2NDh064Nq1a8jOzgYAODk56W3j5OQkrcvOzoaZmRlsbW0fWePo6Fju2I6OjlJNRWbMmCHNOVKr1XBzc3uqcyUiIqLaq0YDUa9evfDaa6/B19cX3bt3xy+//ALg/qWxMgqFQm8bIUS5tgc9WFNR/eP2M3nyZOh0Oul18eLFSp0TERERPXtq/JLZ31laWsLX1xenT5+W5hU9OIqTk5MjjRppNBoUFxcjLy/vkTVXr14td6zc3Nxyo09/p1QqYWNjo/ciIiKiuqlWBaKioiKkp6fD2dkZXl5e0Gg02Lp1q7S+uLgYO3fuRIcOHQAAbdu2hampqV5NVlYWjh07JtUEBARAp9PhwIEDUs3+/fuh0+mkGiIiIpK3Gr3LbPz48ejTpw/c3d2Rk5ODadOmIT8/H0OGDIFCoUBUVBSmT58Ob29veHt7Y/r06bCwsEBYWBgAQK1WIyIiAuPGjYO9vT3s7Owwfvx46RIcAPj4+CA4OBjDhg3DkiVLAADDhw9HSEgI7zAjIiIiADUciC5duoRBgwbhr7/+QsOGDdG+fXskJyfDw8MDADBx4kQUFhZi5MiRyMvLg7+/P7Zs2QJra2tpHzExMahfvz4GDBiAwsJCdOvWDfHx8ahXr55Us3r1akRGRkp3o4WGhiI2NrZ6T5aIiIhqLYUQQtR0J54F+fn5UKvV0Ol0nE9ERPSMm/Doe3Ookr56BhJEZT+/a9UcIiIiIqKawEBEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREsmdQILp37x4+/fRTXLx4sar6Q0RERFTtDApE9evXx1dffYWSkpKq6g8RERFRtTP4kln37t2xY8eOKugKERERUc2ob+gGvXr1wuTJk3Hs2DG0bdsWlpaWeutDQ0ON1jkiIiKi6qAQQghDNjAxefigkkKhqLOX0/Lz86FWq6HT6WBjY1PT3SEioqcwQVHTPagbvjIoQdSMyn5+GzxC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HLK+7b60tPSpOkZERERU2xg8h4iIiIiorql0INq/fz9+++03vbZvv/0WXl5ecHR0xPDhw1FUVGT0DhIRERFVtUoHoujoaBw9elRaTktLQ0REBLp3744PP/wQP/30E2bMmFElnSQiIiKqSpUORFqtFt26dZOWExIS4O/vj7i4OIwdOxbz58/HunXrqqSTRERERFWp0oEoLy8PTk5O0vLOnTsRHBwsLb/44ou4ePGicXtHREREVA0qHYicnJyQmZkJACguLsahQ4cQEBAgrb958yZMTU2N30MiIiKiKlbpQBQcHIwPP/wQu3fvxuTJk2FhYaH3ZOqjR4+icePGVdJJIiIioqpU6ecQTZs2Da+++io6d+4MKysrrFixAmZmZtL6//znP+jRo0eVdJKIiIioKlU6EDVs2BC7d++GTqeDlZUV6tWrp7d+/fr1sLKyMnoHiYiIiKqawU+qVqvVFbbb2dk9dWeIiIiIagKfVE1ERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyV6OBaMaMGXjxxRdhbW0NR0dH9OvXDxkZGXo1QghER0fDxcUFKpUKgYGBOH78uF5NUVERxowZAwcHB1haWiI0NBSXLl3Sq8nLy0N4eDjUajXUajXCw8Nx48aNqj7FOmnXrl3o06cPXFxcoFAosHHjRr31BQUFGD16NFxdXaFSqeDj44NFixbp1bz77rto3LgxVCoVGjZsiL59++LkyZPS+vPnzyMiIgJeXl5QqVRo3Lgxpk6diuLi4uo4RSIikpkaDUQ7d+7EqFGjkJycjK1bt+LevXvo0aMHbt26JdXMmjULc+fORWxsLFJSUqDRaBAUFISbN29KNVFRUUhMTERCQgL27NmDgoIChISEoKSkRKoJCwuDVqtFUlISkpKSoNVqER4eXq3nW1fcunULfn5+iI2NrXD9Bx98gKSkJKxatQrp6en44IMPMGbMGPz4449STdu2bbF8+XKkp6dj8+bNEEKgR48e0u/s5MmTKC0txZIlS3D8+HHExMRg8eLF+Oijj6rlHImISF4UQghR050ok5ubC0dH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2bP45ptvMGLECCP2kohqAgMREclGly5doNVqsXfvXgQHB2PAgAHIycl5on1duXIFwcHB6N+/P9555x0j95SIqhsDERHJhqWlJZo0aYL27dtj2bJlqF+/PpYtW2bwfq5cuYIuXbogICAAS5curYKeElF1YyAiItkSQqCoqMigbS5fvozAwEC88MILWL58OUxM+GeUqC6oX9MdICIyhoKCApw5c0ZazszMhFarhZ2dHezt7fHFF18gNDQUzs7OuHbtGhYuXIhLly6hf//+0jbZ2dnIzs6W9pOWlgZra2u4u7vDzs4OV65cQWBgINzd3TF79my9W/Y1Gk31nSwRGR0DERHVCQcPHkSXLl2k5bFjxwIAhgwZgsWLF+PkyZNYsWIF/vrrL9jb2+PFF1/E7t270aJFC2mbxYsX49NPP5WWO3XqBABYvnw5hg4dii1btuDMmTM4c+YMXF1d9Y7PJ5gQPdv4HKJK4nOI5OdZeL4GET0Z/q00jmfh7ySfQ0RERERUSbxkRkRViv8nbjzPwv+NEz2rOEJEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyV6OBaNeuXejTpw9cXFygUCiwceNGvfVCCERHR8PFxQUqlQqBgYE4fvy4Xk1RURHGjBkDBwcHWFpaIjQ0FJcuXdKrycvLQ3h4ONRqNdRqNcLDw3Hjxo0qPjsiIiJ6VtRoILp16xb8/PwQGxtb4fpZs2Zh7ty5iI2NRUpKCjQaDYKCgnDz5k2pJioqComJiUhISMCePXtQUFCAkJAQlJSUSDVhYWHQarVISkpCUlIStFotwsPDq/z8iIiI6NlQvyYP3qtXL/Tq1avCdUIIzJs3Dx9//DFeffVVAMCKFSvg5OSENWvW4N1334VOp8OyZcuwcuVKdO/eHQCwatUquLm5Ydu2bejZsyfS09ORlJSE5ORk+Pv7AwDi4uIQEBCAjIwMNG3atHpOloiIiGqtWjuHKDMzE9nZ2ejRo4fUplQq0blzZ+zduxcAkJqairt37+rVuLi4oGXLllLNvn37oFarpTAEAO3bt4darZZqKlJUVIT8/Hy9FxEREdVNtTYQZWdnAwCcnJz02p2cnKR12dnZMDMzg62t7SNrHB0dy+3f0dFRqqnIjBkzpDlHarUabm5uT3U+REREVHvV2kBURqFQ6C0LIcq1PejBmorqH7efyZMnQ6fTSa+LFy8a2HMiIiJ6VtTaQKTRaACg3ChOTk6ONGqk0WhQXFyMvLy8R9ZcvXq13P5zc3PLjT79nVKphI2Njd6LiIiI6qZaG4i8vLyg0WiwdetWqa24uBg7d+5Ehw4dAABt27aFqampXk1WVhaOHTsm1QQEBECn0+HAgQNSzf79+6HT6aQaIiIikrcavcusoKAAZ86ckZYzMzOh1WphZ2cHd3d3REVFYfr06fD29oa3tzemT58OCwsLhIWFAQDUajUiIiIwbtw42Nvbw87ODuPHj4evr69015mPjw+Cg4MxbNgwLFmyBAAwfPhwhISE8A4zIiIiAlDDgejgwYPo0qWLtDx27FgAwJAhQxAfH4+JEyeisLAQI0eORF5eHvz9/bFlyxZYW1tL28TExKB+/foYMGAACgsL0a1bN8THx6NevXpSzerVqxEZGSndjRYaGvrQZx8RERGR/CiEEKKmO/EsyM/Ph1qthk6nq9XziSY8er45GeAr/sswCr4njYfvSePh+9I4noX3ZGU/v2vtHCIiIiKi6sJARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyV7+mO/CsEEIAAPLz82u4J49WVNMdqENq+a/6mcH3pPHwPWk8fF8ax7Pwniz73C77HH8YhXhcBQEALl26BDc3t5ruBhERET2BixcvwtXV9aHrGYgqqbS0FFeuXIG1tTUUCkVNd+eZlZ+fDzc3N1y8eBE2NjY13R0iAHxfUu3D96TxCCFw8+ZN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", + "image/png": "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6+sjLi4O4eHhyMvLg5OTE8aNG6cSdszMzLB7924EBATAw8MDtWrVwpQpU3jLPREREYlkgiAIFV1EZadUKmFmZoacnByYmppWdDlERPQWJsgquoLqI7KSJwh1vr+rxBgiIiIiorLEQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJJXoYEoPj4efn5+sLW1hUwmw5YtW1S2Dxs2DDKZTOXl4+Oj0ubu3bsYOHAgTE1NYW5uDn9/f+Tm5qq0SUpKwvvvvw8DAwPY2dlh9uzZZX1oREREVIVUaCB68OABmjZtisWLF7+0jY+PD9LT08XXmjVrVLYPHDgQ586dw549e7B9+3bEx8dj1KhR4nalUgkvLy84ODggMTERkZGRCA8Px9KlS8vsuIiIiKhq0anInfv6+sLX1/eVbfT19SGXy0vcduHCBezcuRMnTpxAixYtAACLFi1C9+7dMWfOHNja2iI2Nhb5+flYsWIF9PT00LhxYygUCkRFRakEp+fl5eUhLy9PXFYqlW94hERERFQVVPoxRAcOHICVlRWcnZ0xZswY3LlzR9yWkJAAc3NzMQwBQNeuXaGlpYVjx46Jbdq3bw89PT2xjbe3N1JSUpCdnV3iPiMiImBmZia+7OzsyujoiIiIqDKo1IHIx8cHv/76K/bt24dZs2bh4MGD8PX1RUFBAQAgIyMDVlZWKu/R0dGBhYUFMjIyxDbW1tYqbYqWi9q8KCwsDDk5OeLrxo0bmj40IiIiqkQq9JLZ6/Tr10/82dXVFW5ubqhXrx4OHDiALl26lNl+9fX1oa+vX2b9ExERUeVSqc8Qvahu3bqoVasWLl++DACQy+XIyspSafP06VPcvXtXHHckl8uRmZmp0qZo+WVjk4iIiEhaqlQgunnzJu7cuQMbGxsAgKenJ+7du4fExESxzV9//YXCwkK0atVKbBMfH48nT56Ibfbs2QNnZ2fUrFmzfA+AiIiIKqUKDUS5ublQKBRQKBQAgNTUVCgUCqSlpSE3NxcTJkzA0aNHce3aNezbtw8ffvgh6tevD29vbwCAi4sLfHx8MHLkSBw/fhyHDx9GYGAg+vXrB1tbWwDAgAEDoKenB39/f5w7dw5r167FggULEBISUlGHTURERJVMhQaikydPwt3dHe7u7gCAkJAQuLu7Y8qUKdDW1kZSUhJ69uyJd999F/7+/vDw8MChQ4dUxvfExsaiYcOG6NKlC7p374527dqpzDFkZmaG3bt3IzU1FR4eHhg/fjymTJny0lvuiYiISHpkgiAIFV1EZadUKmFmZoacnByYmppWdDlERPQWJsgquoLqI7KSJwh1vr+r1BgiIiIiorLAQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSp1Ygevr0KaZPn46bN2+WVT1ERERE5U6tQKSjo4PIyEg8ffq0rOohIiIiKndqXzLr3LkzDh48WBa1EBEREVUIHXXf4Ovri6+//hrJycnw8PBAjRo1VLb37NlTY8URERERlQeZIAiCOm/Q0nr5SSWZTIaCgoK3LqqyUSqVMDMzQ05ODkxNTSu6HCIiegsTZBVdQfURqVaCKH/qfH+rfYaosLDwjQsjIiIiqox42z0RERFJ3hsFooMHD8LPzw/169dH/fr10bNnTxw6dEjTtRERERGVC7UD0apVq9C1a1cYGRkhKCgIQUFBMDQ0RJcuXbB69eqyqJGIiIioTKk9qNrFxQWjRo3CuHHjVNZHRUVh2bJluHDhgkYLrAw4qJqIqPrgoGrNqU6DqtU+Q3T16lX4+fkVW9+zZ0+kpqaq1Vd8fDz8/Pxga2sLmUyGLVu2iNuePHmC0NBQuLq6okaNGrC1tcWQIUNw69YtlT4cHR0hk8lUXjNnzlRpk5SUhPfffx8GBgaws7PD7Nmz1aqTiIiIqje1A5GdnR327dtXbP3evXthZ2enVl8PHjxA06ZNsXjx4mLbHj58iFOnTmHy5Mk4deoUNm3ahJSUlBLnOZo+fTrS09PF1xdffCFuUyqV8PLygoODAxITExEZGYnw8HAsXbpUrVqJiIio+lL7tvvx48cjKCgICoUCbdq0AQAcPnwYMTExWLBggVp9+fr6wtfXt8RtZmZm2LNnj8q6H374Ae+99x7S0tJgb28vrjcxMYFcLi+xn9jYWOTn52PFihXQ09ND48aNoVAoEBUVhVGjRqlVLxEREVVPap8hGjNmDOLi4pCcnIzg4GAEBwfj7NmzWLt2LT7//POyqFGUk5MDmUwGc3NzlfUzZ86EpaUl3N3diz1rLSEhAe3bt4eenp64ztvbGykpKcjOzi5xP3l5eVAqlSovIiIiqr7UPkMEAB999BE++ugjTdfySo8fP0ZoaCj69++vMjAqKCgIzZs3h4WFBY4cOYKwsDCkp6cjKioKAJCRkQEnJyeVvqytrcVtNWvWLLaviIgITJs2rQyPhoiIiCoTtc8Q1a1bF3fu3Cm2/t69e6hbt65GinrRkydP0KdPHwiCgOjoaJVtISEh6NixI9zc3DB69GjMnTsXixYtQl5e3hvvLywsDDk5OeLrxo0bb3sIREREVImpfYbo2rVrJT6vLC8vD//++69GinpeURi6fv06/vrrr9feNteqVSs8ffoU165dg7OzM+RyOTIzM1XaFC2/bNyRvr4+9PX1NXMAREREVOmVOhBt3bpV/HnXrl0wMzMTlwsKCrBv3z44OjpqtLiiMHTp0iXs378flpaWr32PQqGAlpYWrKysAACenp745ptv8OTJE+jq6gIA9uzZA2dn5xIvlxEREZH0lDoQ9erVC8CzJ9oPHTpUZZuuri4cHR0xd+5ctXaem5uLy5cvi8upqalQKBSwsLCAjY0NPvnkE5w6dQrbt29HQUEBMjIyAAAWFhbQ09NDQkICjh07hk6dOsHExAQJCQkYN24cBg0aJIadAQMGYNq0afD390doaCjOnj2LBQsWYN68eWrVSkRERNWX2jNVOzk54cSJE6hVq9Zb7/zAgQPo1KlTsfVDhw5FeHh4scHQRfbv34+OHTvi1KlTGDt2LP755x/k5eXByckJgwcPRkhIiMolr6SkJAQEBIh1f/HFFwgNDS11nZypmoio+uBM1ZpTnWaqVjsQSREDERFR9cFApDnVKRCpfZdZUFAQFi5cWGz9Dz/8gODgYHW7IyIiIqpwageijRs3om3btsXWt2nTBhs2bNBIUURERETlSe1AdOfOHZU7zIqYmpriv//+00hRREREROVJ7UBUv3597Ny5s9j6P//8s8wmZiQiIiIqS2pPzBgSEoLAwEDcvn0bnTt3BgDs27cPc+fOxfz58zVdHxEREVGZUzsQDR8+HHl5efjuu+8wY8YMAICjoyOio6MxZMgQjRdIREREVNbe6rb727dvw9DQEMbGxpqsqdLhbfdERNUHb7vXnOp02/0bPe2+SO3atd/m7URERESVwhsFog0bNmDdunVIS0tDfn6+yrZTp05ppDAiIiKi8qL2XWYLFy7EZ599Bmtra5w+fRrvvfceLC0tcfXqVfj6+pZFjURERERlSu1AtGTJEixduhSLFi2Cnp4eJk6ciD179iAoKAg5OTllUSMRERFRmVI7EKWlpaFNmzYAAENDQ9y/fx8AMHjwYKxZs0az1RERERGVA7UDkVwux927dwEA9vb2OHr0KAAgNTUVfE4sERERVUVqB6LOnTtj69atAIDPPvsM48aNQ7du3dC3b1989NFHGi+QiIiIqKypfZfZ0qVLUVhYCAAICAiApaUljhw5gp49e+Lzzz/XeIFEREREZa1UZ4g+/vhjKJVKAMCqVatQUFAgbuvXrx8WLlyIL774Anp6emVTJREREVEZKlUg2r59Ox48eADg2WUy3k1GRERE1UmpLpk1bNgQYWFh6NSpEwRBwLp16146BTafZ0ZERERVTameZXbkyBGEhITgypUruHv3LkxMTCCTFX8YjEwmE+9Aq074LDMiouqDzzLTHMk9y6xNmzbi7fVaWlq4ePEirKys3r5SIiIiokpA7dvuU1NT+VBXIiIiqlbUvu3ewcGhLOogIiIiqjBqnyEiIiIiqm4YiIiIiEjyGIiIiIhI8tQeQ1QkKysLKSkpAABnZ2fedUZERERVltpniO7fv4/BgwfjnXfeQYcOHdChQwe88847GDRoEGewJiIioipJ7UA0YsQIHDt2DNu3b8e9e/dw7949bN++HSdPnuTDXYmIiKhKUvuS2fbt27Fr1y60a9dOXOft7Y1ly5bBx8dHo8URERERlQe1zxBZWlrCzMys2HozMzPUrFlTI0URERERlSe1A9GkSZMQEhKCjIwMcV1GRgYmTJiAyZMna7Q4IiIiovKg9iWz6OhoXL58Gfb29rC3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hIaGYuLEiYiMjNRgpURUWTAQ0VurU6cOZs6cicTERJw8eRKdO3fGhx9+iHPnzsHOzg7p6ekqr2nTpsHY2Ficibxv377F2nh7e6NDhw6wsrKq4KOjqigxMRFZWVlo3rw5dHR0oKOjg4MHD2LhwoXQ0dGBtbX1ayd2LUmrVq1w8+ZN5OXllfEREFF54yUzemt+fn4qy9999x2io6Nx9OhRNG7cuNgXzObNm9GnTx8YGxsDAAwNDVUexXL79m389ddfWL58edkXT9VSly5dkJycrLLus88+Q8OGDREaGgo7OztxYtfevXsDKD6xa0kUCgVq1qzJecyIqiEGItKogoICrF+/Hg8ePCjxiyUxMREKhQKLFy9+aR+//vorjIyM8Mknn5RlqVSNmZiYoEmTJirratSoAUtLS3H96yZ23bZtGzIzM9G6dWsYGBhgz549+P777/HVV1+V+/EQUdljICKNSE5OhqenJx4/fgxjY2Ns3ry5xMejLF++HC4uLmjTps1L+1q+fDkGDBhQpg/wJZo3bx60tLTQu3dv5OXlwdvbG0uWLBG36+rqYvHixRg3bhwEQUD9+vURFRWFkSNHVmDVRFRWODFjKXBixtfLz89HWloacnJysGHDBvz88884ePCgSih69OgRbGxsMHnyZIwfP77EfhISEtCmTRucPHkSHh4e5VU+EUkIJ2bUnOo0MSPPEJFG6OnpoX79+gAADw8PnDhxAgsWLMBPP/0kttmwYQMePnyIIUOGvLSfn3/+Gc2aNWMYIiKicsVARGWisLCw2J04y5cvR8+ePcVn0b0oNzcX69atQ0RERHmUSOWE/xrXnMr+r3GiqoyBiN5aWFgYfH19YW9vj/v372P16tU4cOAAdu3aJba5fPky4uPjsWPHjpf2s3btWjx9+hSDBg0qj7KJiIhEDET01rKysjBkyBCkp6fDzMwMbm5u2LVrF7p16ya2WbFiBerUqQMvL6+X9rN8+XJ8/PHHxWYPJiIiKmscVF0KHFRN9OZ4yUxzeMlMM/iZ1JzK/pnk0+6JiIiI1MBLZtUM/+WjGZX9Xz1ERKRZPENEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLHQERERESSx0BEREREksdARERERJLH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", "text/plain": [ "
" ] @@ -738,15 +765,7 @@ } ], "source": [ - "ax = performance_df.plot.bar(\n", - " color=\"#7400ff\",\n", - " ylim=(1, 7000),\n", - " rot=0,\n", - " xlabel=\"String method\",\n", - " ylabel=\"Speedup factor\",\n", - ")\n", - "ax.bar_label(ax.containers[0], fmt=\"%.0f\")\n", - "plt.show()" + "performance_plot(performance_df, xlabel=\"String method\")" ] }, { @@ -767,7 +786,16 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "num_rows = 10_000_000" + ] + }, + { + "cell_type": "code", + "execution_count": 20, "metadata": { "tags": [] }, @@ -799,23 +827,23 @@ " \n", " \n", " 0\n", - " 87\n", + " 6\n", " \n", " \n", " 1\n", - " 71\n", + " 28\n", " \n", " \n", " 2\n", - " 63\n", + " 29\n", " \n", " \n", " 3\n", - " 40\n", + " 81\n", " \n", " \n", " 4\n", - " 92\n", + " 69\n", " \n", " \n", " ...\n", @@ -823,23 +851,23 @@ " \n", " \n", " 9999995\n", - " 4\n", + " 38\n", " \n", " \n", " 9999996\n", - " 28\n", + " 95\n", " \n", " \n", " 9999997\n", - " 31\n", + " 19\n", " \n", " \n", " 9999998\n", - " 4\n", + " 67\n", " \n", " \n", " 9999999\n", - " 47\n", + " 29\n", " \n", " \n", "\n", @@ -848,28 +876,27 @@ ], "text/plain": [ " age\n", - "0 87\n", - "1 71\n", - "2 63\n", - "3 40\n", - "4 92\n", + "0 6\n", + "1 28\n", + "2 29\n", + "3 81\n", + "4 69\n", "... ...\n", - "9999995 4\n", - "9999996 28\n", - "9999997 31\n", - "9999998 4\n", - "9999999 47\n", + "9999995 38\n", + "9999996 95\n", + "9999997 19\n", + "9999998 67\n", + "9999999 29\n", "\n", "[10000000 rows x 1 columns]" ] }, - "execution_count": 25, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "num_rows = 10_000_000\n", "pdf_age = pd.DataFrame(\n", " {\n", " \"age\": np.random.randint(0, 100, num_rows),\n", @@ -880,7 +907,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 21, "metadata": { "tags": [] }, @@ -912,23 +939,23 @@ " \n", " \n", " 0\n", - " 87\n", + " 6\n", " \n", " \n", " 1\n", - " 71\n", + " 28\n", " \n", " \n", " 2\n", - " 63\n", + " 29\n", " \n", " \n", " 3\n", - " 40\n", + " 81\n", " \n", " \n", " 4\n", - " 92\n", + " 69\n", " \n", " \n", " ...\n", @@ -936,23 +963,23 @@ " \n", " \n", " 9999995\n", - " 4\n", + " 38\n", " \n", " \n", " 9999996\n", - " 28\n", + " 95\n", " \n", " \n", " 9999997\n", - " 31\n", + " 19\n", " \n", " \n", " 9999998\n", - " 4\n", + " 67\n", " \n", " \n", " 9999999\n", - " 47\n", + " 29\n", " \n", " \n", "\n", @@ -961,22 +988,22 @@ ], "text/plain": [ " age\n", - "0 87\n", - "1 71\n", - "2 63\n", - "3 40\n", - "4 92\n", + "0 6\n", + "1 28\n", + "2 29\n", + "3 81\n", + "4 69\n", "... ...\n", - "9999995 4\n", - "9999996 28\n", - "9999997 31\n", - "9999998 4\n", - "9999999 47\n", + "9999995 38\n", + "9999996 95\n", + "9999997 19\n", + "9999998 67\n", + "9999999 29\n", "\n", "[10000000 rows x 1 columns]" ] }, - "execution_count": 26, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -988,7 +1015,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 22, "metadata": { "tags": [] }, @@ -1015,7 +1042,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -1026,7 +1053,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -1039,34 +1066,34 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0 AI\n", - "1 ABC\n", - "2 hello world\n", - "3 abc\n", - "4 hello world\n", - " ... \n", - "99999995 AI\n", - "99999996 AI\n", - "99999997 abc\n", - "99999998 abc\n", - "99999999 hello world\n", - "Name: strings, Length: 100000000, dtype: object" + "0 ABC\n", + "1 hello world\n", + "2 hello world\n", + "3 AI\n", + "4 AI\n", + " ... \n", + "9999995 hello world\n", + "9999996 abc\n", + "9999997 ABC\n", + "9999998 ABC\n", + "9999999 AI\n", + "Name: strings, Length: 10000000, dtype: object" ] }, - "execution_count": 30, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd_series = pd.Series(\n", - " np.random.choice([\"ABC\", \"abc\", \"hello world\", \"AI\"], size=100_000_000),\n", + " np.random.choice([\"ABC\", \"abc\", \"hello world\", \"AI\"], size=num_rows),\n", " name=\"strings\",\n", ")\n", "pd_series" @@ -1074,27 +1101,27 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0 AI\n", - "1 ABC\n", - "2 hello world\n", - "3 abc\n", - "4 hello world\n", - " ... \n", - "99999995 AI\n", - "99999996 AI\n", - "99999997 abc\n", - "99999998 abc\n", - "99999999 hello world\n", - "Name: strings, Length: 100000000, dtype: object" + "0 ABC\n", + "1 hello world\n", + "2 hello world\n", + "3 AI\n", + "4 AI\n", + " ... \n", + "9999995 hello world\n", + "9999996 abc\n", + "9999997 ABC\n", + "9999998 ABC\n", + "9999999 AI\n", + "Name: strings, Length: 10000000, dtype: object" ] }, - "execution_count": 31, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1106,7 +1133,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -1117,7 +1144,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 28, "metadata": { "tags": [] }, @@ -1149,11 +1176,11 @@ " \n", " \n", " Numeric\n", - " 362.091673\n", + " 20.335476\n", " \n", " \n", " String\n", - " 204.865789\n", + " 8.280955\n", " \n", " \n", "\n", @@ -1161,11 +1188,11 @@ ], "text/plain": [ " cudf speedup vs. pandas\n", - "Numeric 362.091673\n", - "String 204.865789" + "Numeric 20.335476\n", + "String 8.280955" ] }, - "execution_count": 34, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1192,14 +1219,12 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "tags": [] - }, + "execution_count": 29, + "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA98klEQVR4nO3deXxM9/7H8fdk30OCLARR+660KXUttbd2t7S0pVQpqrmlXHUVlyZoLVW7aqPWS5VLF7W0Uq5qCSlKKU2LSppWI7FEgpzfHx6ZX6exZJKJxMnr+XjM42G+5ztnPidM5u18v+d7LIZhGAIAADApp8IuAAAAoCARdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKkRdgAAgKm5FHYBRUFWVpbOnj0rX19fWSyWwi4HAADkgmEYunDhgkJDQ+XkdOvzN4QdSWfPnlVYWFhhlwEAAPLg9OnTKleu3C23E3Yk+fr6Srrxw/Lz8yvkagAAQG6kpaUpLCzM+j1+K4QdyTp05efnR9gBAOAec6cpKExQBgAApkbYAQAApkbYAQAApsacHQCww/Xr13X16tXCLgMoFlxdXeXs7Jzv/RB2ACAXDMNQUlKSzp8/X9ilAMVKiRIlFBwcnK918Ag7AJAL2UGnTJky8vLyYgFSoIAZhqHLly8rOTlZkhQSEpLnfRF2AOAOrl+/bg06gYGBhV0OUGx4enpKkpKTk1WmTJk8D2kxQRkA7iB7jo6Xl1chVwIUP9mfu/zMlSPsAEAuMXQF3H2O+NwRdgAAgKkRdgAAgKkxQRkA8uGVuzyy9YZxd9/vZmJiYhQZGWlzGf6iRYs0adIk/fLLL5oxY4YiIyMLrT57/PTTTwoPD9eBAwdUv379wi7nnlWxYkVFRkYW2b93wg4AIF/S0tI0bNgwzZgxQz169JC/v39hlwTYIOwAAPLl1KlTunr1qh577LF8rYUCFBTm7ACAiWVlZWnq1KmqXLmy3N3dVb58eb3++uuSpB07dshisdgMR8XHx8tiseinn36ytsXExKh8+fLy8vJSt27ddO7cOZttderUkSRVqlQpx2uzZWZmatiwYQoJCZGHh4cqVqyo6Oho63aLxaL58+erQ4cO8vT0VHh4uNauXWuzj19++UW9evVSyZIlFRgYqC5duuR4r/fee081atSQh4eHqlevrnnz5tls/+abb9SgQQN5eHioUaNGOnDggM32mJgYlShRwqZtw4YNNlcETZgwQfXr19fChQsVFhYmLy8vPf7447dcXTsrK0vlypXTggULbNr3798vi8WiH3/80brf8uXLy93dXaGhoRo+fPhN93czP/30kywWi1avXq0mTZrIw8NDtWrV0o4dO6x9rl+/rgEDBig8PFyenp6qVq2a3nrrLZv99OvXT127dtWbb76pkJAQBQYGaujQoTaXfScnJ6tTp07Wv6cVK1bkqGfGjBmqU6eOvL29FRYWpiFDhujixYvW7T///LM6deqkkiVLytvbW7Vq1dInn3yS6+O1F2EHAExszJgxmjp1qsaNG6cjR45o5cqVCgoKyvXrv/76a/Xv319DhgxRfHy8WrZsqcmTJ1u39+rVS9u2bZN0I0gkJiYqLCwsx35mz56tjRs3as2aNTp27JiWL1+uihUr2vQZN26cevTooW+//VZPPfWUnnzySR09elSSdPnyZbVs2VI+Pj768ssvtWvXLvn4+Kh9+/bKzMyUJC1evFhjx47V66+/rqNHjyoqKkrjxo3T0qVLJUmXLl1Sx44dVa1aNcXFxWnChAkaOXKkXT/PbCdOnNCaNWu0adMmbd68WfHx8Ro6dOhN+zo5OemJJ57IEQpWrlypxo0bq1KlSvrggw80c+ZMLVy4UD/88IM2bNhgDZH2eOWVVzRixAgdOHBATZo0UefOna3hNDt0rVmzRkeOHNFrr72mV199VWvWrLHZxxdffKGTJ0/qiy++0NKlSxUTE6OYmBjr9n79+umnn37S559/rg8++EDz5s2zrnL852OePXu2Dh8+rKVLl+rzzz/XqFGjrNuHDh2qjIwMffnllzp06JCmTp0qHx8fu4831wwYqamphiQjNTW1sEsBUASlp6cbR44cMdLT03NsG6m7+7BHWlqa4e7ubixevPim27/44gtDkpGSkmJtO3DggCHJSEhIMAzDMJ588kmjffv2Nq/r1auX4e/vf8vX3MyLL75oPPLII0ZWVtZNt0syBg8ebNMWERFhvPDCC4ZhGMaSJUuMatWq2bw+IyPD8PT0ND777DPDMAwjLCzMWLlypc0+Jk2aZDRu3NgwDMNYuHChERAQYFy6dMm6ff78+YYk48CBA4ZhGMZ7771nc2yGYRjr1683/vx1OX78eMPZ2dk4ffq0te3TTz81nJycjMTExJse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np6eatGihb777jubPi1atJDFYrF5sD5c8WB32AkNDVV8fLxGjhypQYMGqUGDBpoyZYoOHDhwz6+3AwAoemJjYzV06FDt2bNHW7du1bVr19S2bVub+zFOmzZNM2bM0Jw5c7R3714FBwerTZs2unDhgs2+Bg4cqMTEROtj4cKFd/twUAjytaigWbCoIIoLFhWEGfz2228qU6aMYmNj1axZMxmGodDQUEVGRmr06NGSpIyMDAUFBWnq1KkaNGiQpBtndurXr28zFQP3tgJdVPDYsWMaNmyYWrVqpdatW2vYsGH6/vvv81wsAAC5lZqaKkkKCAiQJCUkJCgpKUlt27a19nF3d1fz5s21e/dum9euWLFCpUqVUq1atTRy5MgcZ35gTnaHnQ8++EC1a9dWXFyc6tWrp7p162r//v2qU6eO1q5dWxA1AgAg6cbcnJdffllNmzZV7dq1JUlJSUmSpKCgIJu+QUFB1m2S1KdPH61atUo7duzQuHHjtG7dOnXv3v3uFY9CY/c6O6NGjdKYMWP073//26Z9/PjxGj16tB5//HGHFQcAwJ8NGzZMBw8e1K5du3Jss1hsx+UNw7BpGzhwoPXPtWvXVpUqVdSoUSPt379f999/f8EVjUJn95mdpKQkPfPMMznan3rqKZsEDQCAI7344ovauHGjvvjiC5UrV87aHhwcLEk5voOSk5NznO35s/vvv1+urq764YcfCqZgFBl2h50WLVpo586dOdp37dqlv/3tbw4pCgCAbIZhaNiwYfrwww/1+eefKzw83GZ7eHi4goODtXXrVmtbZmamYmNj1aRJk1vu97vvvtPVq1cVEhJSYLWjaLB7GKtz584aPXq04uLi9NBDD0mS9uzZo7Vr12rixInauHGjTV8AAPJj6NChWrlypf773//K19fXegbH399fnp6eslgsioyMVFRUlKpUqaIqVaooKipKXl5e6t27tyTp5MmTWrFihR599FGVKlVKR44c0YgRI9SgQQM9/PDDhXl4uAvsvvTcySl3J4MsFstNbytRFHHpOYoLLj3Hveivc3Gyvffee+rXr5+kG2d/Jk6cqIULFyolJUURERGaO3eudRLz6dOn9dRTT+nw4cO6ePGiwsLC9Nhjj2n8+PHWq7pw78nt9zfr7Iiwg+KDsAPATAp0nR0AAIB7Ra7n7Hz99df6448/1KFDB2vb+++/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", + "image/png": "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9thjqlOnjvbt26cJEybo+eeft+v7vOHo0aNauXKlPvnkE23YsEEHDhzQ0KFD893Wzc1NvXv31rJly2yWL126VA888ICqVaum1atX6/XXX9dbb72lI0eOaN26ddZgaY9Ro0bpueee04EDB9SiRQt16tTJGlhvBLFVq1bphx9+0Lhx4/Tiiy9q5cqVNm1s3rxZx44d0+bNm7V48WLFxcUpLi7Our5///46efKkNm/erA8//FDz58/XuXPn8hzz7Nmz9f3332vx4sX68ssvNXr0aOv66OhoZWZmatu2bTp48KCmTp0qb29vu4/XHtwCg43i7sAJ53KFDrQoPpcuXdIbb7yhuXPnql+/fpKku+++W61atSp0G2+88YaioqKsP161atXSjh07tGHDBknXR+qtWLGiJKly5co3HUYiOTlZ99xzj1q1aiWTyaRq1arl2aZnz54aNGiQJGnixInauHGj5syZo/nz52vFihXKzc3VO++8Y70as2jRIvn5+WnLli3q0KGDxo8frxkzZqh79+6SpNDQUP3www9666231K9fPy1btky5ubl699135enpqbp16+rUqVMaMmRIob+PG65evar3339fd911lyRpzpw5evTRRzVjxox8v4M+ffpoxowZSk5OVkhIiHJzc7V8+XK99NJL1u8nICBAERERKl26tEJCQtSsWTO76xo2bJh69Ogh6XpfyA0bNujdd9/V6NGjVbp0ab388svWbUNDQ7Vz506tXLlSvXr1si4vX7685s6dq1KlSiksLEyPPvqo4uPjNXjwYP3000/6/PPPtWfPHjVt2lSS9O677yo8PNymjj92hq5evbomTZqkZ5991npFLjk5WT169LC5eljUuAIEAAZx+PBhZWZmqn379rfVRvPmzW2W3cpQEf3791dCQoJq166t4cOH63//+1+ebf7cbosWLaxXgL799lsdPXpUPj4+8vb2lre3typUqKCrV6/q2LFjunz5so4dO6aBAwda13t7e2vSpEk6duyY9Vjq168vT0/P2zoWSQoJCbGGnxvt5ObmKjExMd/tGzZsqPDwcOtVoK1bt+rcuXPq2bOnpOvh7/fff1eNGjU0ePBgrV27VteuXbO7rj8ej7u7u5o0aWL9DiVp3rx5aty4sSpXrixvb2+9/fbbSk5Otmmjbt26Nq+cCAwMtF7hOXz4sNzd3dW4cWPr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/syZMzbTe++9J5PJpB49ehTYbt26dW32++qrr4qifAAAUEK5O/PDO3bsqI4dO950fUBAgM38Rx99pHbt2qlGjRoFtuvu7p5nXwAAgBtKTB+gs2fP6tNPP9XAgQP/ctsjR44oKChINWrUUJ8+fZScnFzg9pmZmUpPT7eZAADAnavEBKDFixfLx8dH3bt3L3C75s2bKy4uThs2bNCCBQuUlJSkBx98UJcuXbrpPrGxsTKbzdYpODjY0eUDAAAXUmIC0Hvvvac+ffrI09OzwO06duyonj17qn79+oqMjNRnn32m1NRUrVy58qb7xMTEKC0tzTqdPHnS0eUDAAAX4tQ+QIW1fft2JSYmasWKFXbv6+fnp1q1auno0aM33cbDw0MeHh63UyIAAChBSsQVoHfffVeNGzdWgwYN7N43IyNDx44dU2BgYBFUBgAASiKnBqCMjAwlJCQoISFBkpSUlKSEhASbTsvp6elatWqVBg0alG8b7du319y5c63zzz//vLZu3arjx49rx44d6tatm0qVKqXevXsX6bEAAICSw6m3wPbu3at27dpZ50eOHClJ6tevn+Li4iRJy5cvl8ViuWmAOXbsmH799Vfr/KlTp9S7d29duHBBlStXVqtWrbRr1y5Vrly56A4EAACUKCaLxWJxdhGuJj09XWazWWlpafL19XV2OcVqlMnZFaA4TefsB3AHsef3u0T0AQIAAHAkAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcAhAAADAcpwagbdu2qVOnTgoKCpLJZNK6dets1vfv318mk8lmioqK+st2582bp+rVq8vT01PNmzfXnj17iugIAABASeTUAHT58mU1aNBA8+bNu+k2UVFROnPmjHX64IMPCmxzxYoVGjlypMaPH6/9+/erQYMGioyM1Llz5xxdPgAAKKHcnfnhHTt2VMeOHQvcxsPDQwEBAYVuc+bMmRo8eLAG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OVMzZ87Ujh079OKLL2r06NFFUSMAAHbJycnR2LFjFRoaKi8vL919992aOHGibuP1l7jD2B2Azpw5o759++ZZ/ve//11nzpxxSFEAANyOqVOnasGCBZo7d64OHz6sqVOnatq0aZozZ46zS4OLsLsPUNu2bbV9+3bVrFnTZvlXX32lBx980GGFAQBwq3bs2KEuXbro0UcflXT9bQUffPCB9uzZ4+TK4CrsDkCdO3fWmDFjtG/fPt1///2SpF27dmnVqlV6+eWX9fHHH9tsCwBAcWvZsqXefvtt/fTTT6pVq5a+/fZbffXVV5o5c6azS4OLMFnsvCHq5la4u2YmkynfV2aUBOnp6TKbzUpLS5Ovr6+zyylWo0zOrgDFaTrdIXCHys3N1Ysvvqhp06apVKlSysnJ0eTJkxUTE+Ps0lCE7Pn9tvsKUG5u7i0XBgBAcVi5cqWWLl2qZcuWqW7dukpISNCIESMUFBSkfv36Obs8uIBbGgcIAABXNmrUKL3wwgt64oknJEn16tXTiRMnFBsbSwCCJDueAtu5c6fWr19vs+z9999XaGioqlSpoqefflqZmZkOLxAAAHtduXIlT5eNUqVKcRcDVoUOQK+88oq+//576/zBgwc1cOBARURE6IUXXtAnn3yi2NjYIikSAAB7dOrUSZMnT9ann36q48ePa+3atZo5c6a6devm7NLgIgp9CywhIUETJ060zi9fvlzNmzfXwoULJUnBwcEaP368JkyY4PAiAQCwx5w5czR27FgNHTpU586dU1BQkJ555hmNGzfO2aXBRRQ6AF28eFH+/v7W+a1bt6pjx47W+aZNm+rkyZOOrQ4AgFvg4+OjWbNmadasWc4uBS6q0LfA/P39lZSUJEnKysrS/v37reMASdKlS5dUunRpx1cIAADgYIW+AvTII4/ohRde0NSpU7Vu3TqVLVvWZuTn7777TnfffXeRFAkAuH2M82UsjPNVsEIHoIkTJ6p79+5q06aNvL29tXjxYpUpU8a6/r333lOHDh2KpEgAAABHKnQAqlSpkrZt26a0tDR5e3urVKlSNutXrVolb29vhxcIAADgaHYPhGg2m/NdXqFChdsuBgAAoDgUuhM0AADAnYIABAAADIcABAAADIcABAAADIcABAAADIcABAAADIcABAAADMflA1D16tVlMpnyTNHR0fluHxcXl2dbT0/P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", "text/plain": [ "
" ] @@ -1209,15 +1234,7 @@ } ], "source": [ - "ax = performance_df.plot.bar(\n", - " color=\"#7400ff\",\n", - " ylim=(1, 550),\n", - " rot=0,\n", - " xlabel=\"UDF Kind\",\n", - " ylabel=\"Speedup factor\",\n", - ")\n", - "ax.bar_label(ax.containers[0], fmt=\"%.0f\")\n", - "plt.show()" + "performance_plot(performance_df, xlabel=\"UDF Kind\")" ] }, { @@ -1230,31 +1247,46 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "timeit_number = 10" + ] + }, + { + "cell_type": "code", + "execution_count": 31, "metadata": { "tags": [] }, "outputs": [], "source": [ "pandas_int_udf, cudf_int_udf = timeit_pandas_cudf(\n", - " pdf_age, gdf_age, lambda df: df.apply(age_udf, axis=1), number=10\n", + " pdf_age,\n", + " gdf_age,\n", + " lambda df: df.apply(age_udf, axis=1),\n", + " number=timeit_number,\n", ")" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "pandas_str_udf, cudf_str_udf = timeit_pandas_cudf(\n", - " pd_series, gd_series, lambda s: s.apply(str_isupper_udf), number=10\n", + " pd_series,\n", + " gd_series,\n", + " lambda s: s.apply(str_isupper_udf),\n", + " number=timeit_number,\n", ")" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 33, "metadata": { "tags": [] }, @@ -1286,11 +1318,11 @@ " \n", " \n", " Numeric\n", - " 95448.144630\n", + " 21377.625003\n", " \n", " \n", " String\n", - " 2587.570338\n", + " 37.422872\n", " \n", " \n", "\n", @@ -1298,11 +1330,11 @@ ], "text/plain": [ " cudf speedup vs. pandas\n", - "Numeric 95448.144630\n", - "String 2587.570338" + "Numeric 21377.625003\n", + "String 37.422872" ] }, - "execution_count": 39, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1329,14 +1361,12 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": { - "tags": [] - }, + "execution_count": 34, + "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAG2CAYAAAC9CcgAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABMBElEQVR4nO3deVwVdf///+cBFQHhiCBboWJuKG5puZbmXuL+UUsv0jSXS43Mrey6Srs0txRLySWzNJdoMU3LNcuFyzWU1HJJQ8WE8FIEV1CY3x/+nG9HXEBHBX3cb7dzu3lmXmfOa04X5zyv98y8x2YYhiEAAADcMaf73QAAAMCDgmAFAABgEYIVAACARQhWAAAAFiFYAQAAWIRgBQAAYBGCFQAAgEUIVgAAABYhWAEAAFiEYAUAAGCR+xqsNmzYoFatWikwMFA2m01LlixxWG8YhkaOHKnAwEC5urqqYcOG+vXXXx1q0tPT9corr8jHx0fu7u5q3bq1jh075lCTkpKi8PBw2e122e12hYeH6/Tp0w41R48eVatWreTu7i4fHx9FREQoIyPDoWb37t1q0KCBXF1d9cgjj+g///mPuCMQAAC46r4Gq3Pnzqlq1aqKioq67voJEyYoMjJSUVFR2r59u/z9/dW0aVOdOXPGrBk4cKAWL16s6OhoxcTE6OzZswoLC1NmZqZZ06VLF8XFxWnlypVauXKl4uLiFB4ebq7PzMxUy5Ytde7cOcXExCg6OlqLFi3S4MGDzZq0tDQ1bdpUgYGB2r59u6ZOnaqJEycqMjLyLnwyAAAgXzLyCEnG4sWLzedZWVmGv7+/MW7cOHPZxYsXDbvdbsyYMcMwDMM4ffq0UbBgQSM6Otqs+fPPPw0nJydj5cqVhmEYxm+//WZIMrZs2WLWbN682ZBk7Nu3zzAMw1i+fLnh5ORk/Pnnn2bN559/bri4uBipqamGYRjGtGnTDLvdbly8eNGsGTt2rBEYGGhkZWVZ+EkAAID8qsB9znU3FB8fr6SkJDVr1sxc5uLiogYNGmjTpk3q06ePYmNjdenSJYeawMBAhYaGatOmTWrevLk2b94su92uWrVqmTW1a9eW3W7Xpk2bVL58eW3evFmhoaEKDAw0a5o3b6709HTFxsbqmWee0ebNm9WgQQO5uLg41AwfPlyHDx9WcHDwdfcjPT1d6enp5vOsrCydOnVK3t7estlslnxWAADg7jIMQ2fOnFFgYKCcnG58wC/PBqukpCRJkp+fn8NyPz8/HTlyxKwpVKiQvLy8stVcfX1SUpJ8fX2zbd/X19eh5tr38fLyUqFChRxqSpUqle19rq67UbAaO3as3nnnnVvuLwAAyPsSEhL06KOP3nB9ng1WV107qmMYxi1Heq6tuV69FTXG/3/i+s36GT58uAYNGmQ+T01NVYkSJZSQkCBPT8+b7gcAAMgb0tLSFBQUJA8Pj5vW5dlg5e/vL+nKaFBAQIC5PDk52Rwp8vf3V0ZGhlJSUhxGrZKTk1W3bl2z5q+//sq2/RMnTjhsZ+vWrQ7rU1JSdOnSJYeaq6NXf38fKfuo2t+5uLg4HD68ytPTk2AFAEA+c6vBnTw7j1VwcLD8/f21Zs0ac1lGRobWr19vhqYaNWqoYMGCDjWJiYnas2ePWVOnTh2lpqZq27ZtZs3WrVuVmprqULNnzx4lJiaaNatXr5aLi4tq1Khh1mzYsMFhCobVq1crMDAw2yFCAADwkLqfZ86fOXPG2Llzp7Fz505DkhEZGWns3LnTOHLkiGEYhjFu3DjDbrcb33zzjbF7927jhRdeMAICAoy0tDRzG3379jUeffRR44cffjB27NhhNGrUyKhatapx+fJls6ZFixZGlSpVjM2bNxubN282KleubISFhZnrL1++bISGhhqNGzc2duzYYfzwww/Go48+agwYMMCsOX36tOHn52e88MILxu7du41vvvnG8PT0NCZOnJirfU5NTTUkmVcbIm9JS0szXn31VaNEiRJG4cKFjTp16hjbtm0z13fr1s2Q5PCoVavWdbeVlZVltGjRItsVr3938eJFo2rVqoYkY+fOnQ7rtm3bZjRq1Miw2+1G0aJFjaZNm2arAQDcGzn9/b6vweqnn37K9iMlyejWrZthGFd+mEaMGGH4+/sbLi4uxtNPP23s3r3bYRsXLlwwBgwYYBQrVsxwdXU1wsLCjKNHjzrUnDx50ujatavh4eFheHh4GF27djVSUlIcao4cOWK0bNnScHV1NYoVK2YMGDDAYWoFwzCMXbt2GU899ZTh4uJi+Pv7GyNHjsz1VAsEq7ytU6dORsWKFY3169cbv//+uzFixAjD09PTOHbsmGEYV4JVixYtjMTERPNx8uTJ624rMjLSePbZZ28arCIiIsyav4emtLQ0w8vLy+jevbuxb98+Y8+ePUaHDh0MX19fIyMjw+rdBgDcQk5/v22GwdTh91JaWprsdrtSU1M5xyqPuXDhgjw8PPTtt9+qZcuW5vJq1aopLCxMo0ePVvfu3XX69Olsdwm41i+//KKwsDBt375dAQEBWrx4sdq2betQs2LFCg0aNEiLFi1SpUqVtHPnTlWrVk2S9PPPP+uJJ57Q0aNHFRQUJOnKzP9VqlTRwYMH9dhjj1m568ijMjMzdenSpfvdBvBQKFiwoJydnW+4Pqe/33n25HXgXrt8+bIyMzNVuHBhh+Wurq6KiYkxn69bt06+vr4qWrSoGjRooHfffddhSo/z58/rhRdeUFRUlHkRxrX++usv9erVS0uWLJGbm1u29eXLl5ePj49mz56tN998U5mZmZo9e7YqVaqkkiVLWrTHyKsMw1BSUlK2W28BuLuKFi0qf3//O5pnkmAF/P88PDxUp04djRo1SiEhIfLz89Pnn3+urVu3qmzZspKkZ599Vh07dlTJkiUVHx+vt956S40aNVJsbKx59edrr72munXrqk2bNtd9H8Mw1L17d/Xt21c1a9bU4cOHr9vLunXr1KZNG40aNUqSVK5cOa1atUoFCvBn+6C7Gqp8fX3l5ubGZMLAXWYYhs6fP29e7f/32Qhyi29o4G/mzZunHj166JFHHpGzs7Mef/xxdenSRTt27JAkde7c2awNDQ1VzZo1VbJkSX3//fdq3769li5dqh9//FE7d+684XtMnTpVaWlpGj58+A1rLly4oB49eqhevXr6/PPPlZmZqYkTJ+q5557T9u3b5erqat1OI0/JzMw0Q5W3t/f9bgd4aFz9Xk1OTpavr+9NDwveTJ6dbgG4Hx577DGtX79eZ8+eVUJCgrZt26ZLly7dcGb9gIAAlSxZUr///rsk6ccff9ShQ4dUtGhRFShQwBxd6tChgxo2bGjWbNmyRS4uLipQoIDKlCkjSapZs6a6desmSVq4cKEOHz6sTz/9VE888YRq166thQsXKj4+Xt9+++1d/hRwP109p+p6h4gB3F1X/+7u5NxGRqyA63B3d5e7u7tSUlK0atUqTZgw4bp1J0+eVEJCgjls/MYbb+jll192qKlcubImT56sVq1aSZKmTJmi0aNHm+uPHz+u5s2b64svvjDvaXn+/Hk5OTk5HAK6+jwrK8vSfUXexOE/4N6z4u+OYAX8zapVq2QYhsqXL6+DBw9q6NChKl++vF566SWdPXtWI0eOVIcOHRQQEKDDhw/rzTfflI+Pj9q1ayfpygz91zthvUSJEuaoV4kSJRzWFSlSRNKV0bKr959q2rSphg4dqv79++uVV15RVlaWxo0bpwIFCuiZZ565mx8BAOAOcCgQ+JvU1FT1799fFSpU0Isvvqj69etr9erV5mW4u3fvVps2bVSuXDl169ZN5cqV0+bNm29576jcqlChgpYtW6Zdu3apTp06euqpp3T8+HGtXLnyjk6qBPKbOXPmqGjRog7LPvroIwUFBcnJyUnvv//+fenrdhw+fFg2m01xcXH3u5V8rVSpUnn6vzsjVsDfdOrUSZ06dbruOldXV61atSrX27zVVHGlSpW6bk3Tpk3VtGnTXL8fHlxD7+HRwffy6AyHaWlpGjBggCIjI9WhQwfZ7fb73RLggGAFAMg3jh49qkuXLqlly5aM3iJP4lAgAMASWVlZGj9+vMqUKSMXFxeVKFFC7777rqQrE+vabDaHSU/j4uJks9kc5nKbM2eOSpQoITc3N7Vr104nT550WFe5cmVJUunSpbO99qqMjAwNGDBAAQEBKly4sEqVKqWxY8ea6202m6ZPn65nn31Wrq6uCg4O1ldffeWwjT///FOdO3eWl5eXvL291aZNm2zv9emnnyokJESFCxdWhQoVNG3aNIf127ZtU/Xq1VW4cGHVrFkz2zQs1zvMuWTJEocTqEeOHKlq1app5syZCgoKkpubmzp27HjDyWOzsrL06KOPasaMGQ7Ld+zYIZvNpj/++MPcbokSJeTi4qLAwEBFRERcd3vXc/WQZnR0tOrWravChQurUqVKWrdunVmTmZmpnj17Kjg4WK6uripfvrw++OADh+10795dbdu21cSJExUQECBvb2/179/f4Yq85ORktWrVyvzvtGDBgmz9REZGqnLlynJ3d1dQUJD69euns2fPmuuPHDmiVq1aycvLS+7u7qpUqZKWL1+e4/3NLUascM/cy8MYuP/y6qEk3D3Dhw/XrFmzNHnyZNWvX1+JiYnat29fjl+/detW9ejRQ2PGjFH79u21cuVKjRgxwlzfuXNnBQUFqUmTJtq2bZuCgoJUvHjxbNuZMmWKli5dqi+//FIlSpRQQkKCEhISHGreeustjRs3Th988IHmzZunF154QaGhoQoJCdH58+f1zDPP6KmnntKGDRtUoEABjR49Wi1atNCuXbtUqFAhzZo1SyNGjFBUVJSqV6+unTt3qlevXnJ3d1e3bt107tw5hYWFqVGjRpo/f77i4+P16quv3tbnevDgQX355ZdatmyZ0tLS1LNnT/Xv3/+6IcPJyUnPP/+8FixYoL59+5rLFy5cqDp16qh06dL6+uuvNXnyZEVHR6tSpUpKSkrSL7/8kuu+hg4dqvfff18VK1ZUZGSkWrdurfj4eHl7e5sB78svv5SPj482bdqk3r17KyAgwOF0i59++kkBAQH66aefdPDgQXXu3FnVqlVTr169JF0JXwkJCfrxxx9VqFAhRUREmJN4/n2fp0yZolKlSik+Pl79+vXTsGHDzKDbv39/ZWRkaMOGDXJ3d9dvv/1mXjR0NxCsAAB37MyZM/rggw8UFRVlzsf22GOPqX79+jnexgcffKDmzZvrjTfekHTlbgObNm3SypUrJV05z/HqpKnFixe/4S2jjh49qrJly6p+/fqy2WzXvQ1Ux44dzalRRo0apTVr1mjq1KmaNm2aoqOj5eTkpI8//tgcPfr0009VtGhRrVu3Ts2aNdOoUaM0adIktW/fXpIUHBys3377TTNnzlS3bt20YMECZWZm6pNPPpGbm5sqVaqkY8eO6Z///GeOP4+rLl68qLlz55pXDU+dOlUtW7bUpEmTrvsZdO3aVZGRkTpy5IhKliyprKwsRUdH68033zQ/H39/fzVp0kQFCxZUiRIl9OSTT+a6rwEDBqhDhw6SpOnTp2vlypWaPXu2hg0bpoIFC+qdd94xa4ODg7Vp0yZ9+eWXDsHKy8tLUVFRcnZ2VoUKFdSyZUutXbtWvXr10oEDB7RixQpt2bLFnIpm9uzZCgkJcehj4MCBDu8zatQo/fOf/zSD1dGjR9WhQweH0c67iUOBAIA7tnfvXqWnp6tx48Z3tI06deo4LLv2eU50795dcXFxKl++vCIiIrR69epsNdd7n71790qSYmNjdfDgQXl4eKhIkSIqUqSIihUrposXL+rQoUM6ceKEEhIS1LNnT3N9kSJFNHr0aB06dMjcl6pVqzpM9Ho7+yJdmaLlaqi6up2srCzt37//uvXVq1dXhQoV9Pnnn0uS1q9fr+TkZDPQdOzYURcuXFDp0qXVq1cvLV68WJcvX851X3/fnwIFCqhmzZrmZyhJM2bMUM2aNVW8eHEVKVJEs2bN0tGjRx22UalSJYcZzgMCAswRqb1795rbvapChQrZDp/+9NNPatq0qR555BF5eHjoxRdf1MmTJ3Xu3DlJUkREhEaPHq169eppxIgR2rVrV673NTcIVgCAO3ar2yw5OV35ufn7FbDXzm59qytoc+rxxx9XfHy8Ro0apQsXLqhTp076v//7v1u+7uroVFZWlmrUqKG4uDiHx4EDB9SlSxdzkt5Zs2Y5rN+zZ4+2bNmS431xcnLKVpeTGb+v9nmzySy7du2qhQsXSrpyGLB58+by8fGRJAUFBWn//v368MMP5erqqn79+unpp5++o9nGr+3tyy+/1GuvvaYePXpo9erViouL00svvaSMjAyH+oIFC2Z7/dXP9+pnc7P9PHLkiJ577jmFhoZq0aJFio2N1Ycffijp/32WL7/8sv744w+Fh4dr9+7dqlmzpqZOnXrH+3ojBCsAwB0rW7asXF1dtXbt2uuuv3ouVGJiorns2vmcKlasaAaTq659nlOenp7q3LmzZs2apS+++EKLFi3SqVOnbrjdLVu2qEKFCpKuBLPff/9dvr6+KlOmjMPDbrfLz89PjzzyiP74449s669OBFyxYkX98ssvunDhwg3fs3jx4jpz5ow5snK9z0S6cijr+PHj5vPNmzfLyclJ5cqVu+H+d+nSRbt371ZsbKy+/vprde3a1WG9q6urWrdurSlTpmjdunXavHmzdu/efcPtXc/f9+fy5cuKjY01P8ONGzeqbt266tevn6pXr64yZcqYo3k5FRISosuXL+vnn382l+3fv9/hxP2ff/5Zly9f1qRJk1S7dm2VK1fO4bO6KigoSH379tU333yjwYMHa9asWbnqJTcIVgCAO1a4cGG9/vrrGjZsmD777DMdOnRIW7Zs0ezZsyVJZcqUUVBQkEaOHKkDBw7o+++/16RJkxy2ERERoZUrV2rChAk6cOCAoqKizPOrcuPqidn79u3TgQMH9NVXX8nf39/hENJXX32lTz75RAcOHNCIESO0bds2DRgwQNKV0R4fHx+1adNGGzduVHx8vNavX69XX31Vx44dk3TlqrqxY8fqgw8+0IEDB7R79259+umnioyMlHQl2Dg5Oalnz5767bfftHz5ck2cONGhz1q1asnNzU1vvvmmDh48qIULF2rOnDnX/Wy7deumX375RRs3blRERIQ6dep0w3PMpCvnGtWtW1c9e/bU5cuX1aZNG3PdnDlzNHv2bO3Zs0d//PGH5s2bJ1dXV/NctOHDh+vFF1+85ef84YcfavHixdq3b5/69++vlJQU9ejRQ9KV/94///yzVq1apQMHDuitt97S9u3bb7nNvytfvrxatGihXr16aevWrYqNjdXLL7/sMDr62GOP6fLly5o6daq5L9deETlw4ECtWrVK8fHx2rFjh3788cds52lZiWAFALDEW2+9pcGDB+vtt99WSEiIOnfubJ4vU7BgQX3++efat2+fqlatqvHjxzvcM1OSateurY8//lhTp05VtWrVtHr1av373//OdR9FihTR+PHjVbNmTT3xxBM6fPiwli9fbh6OlKR33nlH0dHRqlKliubOnasFCxaoYsWKkq7ciHfDhg0qUaKE2rdvr5CQEPXo0UMXLlyQp6enpCuHlz7++GNzCogGDRpozpw55ohVkSJFtGzZMv3222+qXr26/vWvf2n8+PEOfRYrVkzz58/X8uXLVblyZX3++ecaOXJktv0pU6aM2rdvr+eee07NmjVTaGhotqkdrqdr16765Zdf1L59e4cwUrRoUc2aNUv16tVTlSpVtHbtWi1btsy8MCAxMTHbuVDXM27cOI0fP15Vq1bVxo0b9e2335qHG/v27av27durc+fOqlWrlk6ePKl+/frdcpvX+vTTTxUUFKQGDRqoffv26t27t3x9fc311apVU2RkpMaPH6/Q0FAtWLDAYWoN6crUD/3791dISIhatGih8uXL5+jzu102w6qD2siRtLQ02e12paammn+gDwumW3i4MN3C7bl48aLi4+MVHByswoUL3+92Hkg2m02LFy9W27Zt73crtzRy5EgtWbIkT90G5/DhwwoODtbOnTtVrVq1+92OpW7295fT329GrAAAACxCsAIAALAIE4QCAB4q+ekMmJEjR173vKv76UY3jscVjFgBAABYhGAFAHkQIwLAvWfF3x3BCgDykKszUZ8/f/4+dwI8fK7+3V07I3xucI4VAOQhzs7OKlq0qDn/k5ub201v6QHgzhmGofPnzys5OVlFixZ1uH9hbhGsACCPuTqj9tVwBeDeKFq06E1ntM8JghUA5DE2m00BAQHy9fW15Ma4AG6tYMGCdzRSdRXBCgDyKGdnZ0u+6AHcO5y8DgAAYBGCFQAAgEUI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oaFmzebNm2W3281QJUm1a9eW3W53qAkNDTVDlSQ1b95c6enpDocmr5Wenq60tDSHBwAAeDDlOliVLl1aJ0+ezLb89OnTKl26tCVNXfXHH39o+vTpKlu2rFatWqW+ffsqIiJCn332mSQpKSlJkuTn5+fwOj8/P3NdUlKSChUqJC8vr5vW+Pr6Znt/X19fh5pr38fLy0uFChUya65n7Nix5nlbdrv9rpyHBgAA8oZcB6vDhw9f936A6enp+vPPPy1p6qqsrCw9/vjjGjNmjKpXr64+ffqoV69emj59ukOdzeZ4jMkwjGzLrnVtzfXqb6fmWsOHD1dqaqr5SEhIuGlfAAAg/8rxyetLly41/71q1SrZ7XbzeWZmptauXatSpUpZ2lxAQIAqVqzosCwkJESLFi2SJPn7+0u6MpoUEBBg1iQnJ5ujS/7+/srIyFBKSorDqFVycrLq1q1r1vz111/Z3v/EiRMO29m6davD+pSUFF26dCnbSNbfubi4yMXFJcf7DAAA8q8cB6u2bdtKujJq061bN4d1BQsWVKlSpTRp0iRLm6tXr57279/vsOzAgQMqWbKkJCk4OFj+/v5as2aNqlevLknKyMjQ+vXrNX78eElSjRo1VLBgQa1Zs0adOnWSJCUmJmrPnj2aMGGCJKlOnTpKTU3Vtm3b9OSTT0qStm7dqtTUVDN81alTR++++64SExPNELd69Wq5uLioRo0alu43AADIn3IcrLKysiRdCTPbt2+Xj4/PXWvqqtdee01169bVmDFj1KlTJ23btk0fffSRPvroI0lXQt7AgQM1ZswYlS1bVmXLltWYMWPk5uamLl26SJLsdrt69uypwYMHy9vbW8WKFdOQIUNUuXJlNWnSRNKVUbAWLVqoV69emjlzpqQr0y2EhYWpfPnykqRmzZqpYsWKCg8P13vvvadTp05pyJAh6tWr10N3dR8AALi+XM9jdS9nV3/iiSe0ePFiDR8+XP/5z38UHBys999/X127djVrhg0bpgsXLqhfv35KSUlRrVq1tHr1anMOK0maPHmyChQooE6dOunChQtq3Lix5syZY85hJUkLFixQRESEefVg69atFRUVZa53dnbW999/r379+qlevXpydXVVly5dNHHixHvwSQAAgPwg1/NYRUREqEyZMoqIiHBYHhUVpYMHD+r999+3sr8HDvNY4WHBPFYA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x3TgwIE77gmAVLFiRZ07d07SlWCUmZl5V96nQoUK2rVrl8P5XT///PNdeS/cHwQrPPQqV66srl27aurUqeayhg0b6sSJE5owYYIOHTqkDz/8UCtWrLjj9+ratat8fHzUpk0bbdy4UfHx8Vq/fr1effXVXJ1E36BBAz399NPq0KGD1qxZo/j4eK1YsUIrV6684x6BB9nJkyfVqFEjzZ8/X7t27VJ8fLy++uorTZgwQW3atJF05cq+tWvXKikpSSkpKZa+f5cuXZSVlaXevXtr7969WrVqlSZOnChJeXoePeQcwQqQNGrUKIfRqZCQEE2bNk0ffvihqlatqm3btmnIkCF3/D5ubm7asGGDSpQoofbt2yskJEQ9evTQhQsX5OnpmattLVq0SE888YReeOEFVaxYUcOGDbtr/y8beFAUKVJEtWrV0uTJk/X0008rNDRUb731lnr16qWoqChJV67qW7NmjYKCglS9enVL39/T01PLli1TXFycqlWrpn/96196++23JcnhvCvkXzaDg7sAANw3CxYs0EsvvaTU1FTOn3wAcPI6AAD30GeffabSpUvrkUce0S+//KLXX39dnTp1IlQ9IAhWAADcQ0lJSXr77beVlJSkgIAAdezYUe++++79bgsW4VAgAACARTh5HQAAwCIEKwAAAIsQrAAAACxCsAIAALAIwQoA7pN169bJZrPp9OnTd7Sd7t27q23btpb0BODOEKwAPHAaNmyogQMHZlu+ZMkSh9uGzJkzRzabTTabTc7OzvLy8lKtWrX0n//8R6mpqQ6v7d69u1n798fBgwev28P1QtPx48cVGhqq+vXr6/Tp06pbt64SExNzdZ9IAHkbwQrAQ83T01OJiYk6duyYNm3apN69e+uzzz5TtWrVdPz4cYfaFi1aKDEx0eERHByco/c5dOiQ6tevrxIlSmj16tUqWrSoChUqJH9/f+4RBzxACFYAHmo2m03+/v4KCAhQSEiIevbsqU2bNuns2bMaNmyYQ62Li4v8/f0dHs7Ozrd8j127dql+/fqqVauWvv32W7m5uUnKPqo1Z84cFS1aVKtWrVJISIiKFClihrmrMjMzNWjQIBUtWlTe3t4aNmyYmI4QyDsIVgBwDV9fX3Xt2lVLly694xtbb9q0SQ0aNFD79u21YMECFSxY8Kb158+f18SJEzVv3jxt2LBBR48edbgB+KRJk/TJJ59o9uzZiomJ0alTp7R48eI76hGAdQhWAHAdFSpU0JkzZ3Ty5Elz2XfffaciRYqYj44dO95yO+3atVOrVq304Ycfysnp1l+5ly5d0owZM1SzZk09/vjjGjBggNauXWuuf//99zV8+HB16NBBISEhmjFjBudoAXkI9woEgOu4enjt7+c/PfPMM5o+fbr53N3d/ZbbadOmjRYvXqyNGzfqqaeeumW9m5ubHnvsMfN5QECAkpOTJUmpqalKTExUnTp1zPUFChRQzZo1ORwI5BGMWAF44Hh6ema7qk+STp8+LU9PzxxtY+/evfL09JS3t7e5zN3dXWXKlDEfAQEBt9zOzJkz9cILL+jZZ5/V+vXrb1l/7aFCm81GaALyEYIVgAdOhQoV9PPPP2dbvn37dpUvX/6Wr09OTtbChQvVtm3bHB2+uxmbzaaZM2cqPDxczz33nNatW3fb27Lb7QoICNCWLVvMZZcvX1ZsbOwd9QjAOhwKBPDA6devn6KiotS/f3/17t1brq6uWrNmjWbPnq158+Y51BqGoaSkJBmGodOnT2vz5s0aM2aM7Ha7xo0bZ0k/NptN06ZNk7Ozs1q2bKlly5apUaNGt7WtV199VePGjVPZsmUVEhKiyMjIO55gFIB1CFYAHjilSpXSxo0b9a9//UvNmjXTxYsXVa5cOc2ZMyfbCedpaWkKCAiQzWaTp6enypcvr27duunVV1/N8WHDnLDZbIqKipKzs7PCwsK0dOlSFSiQ+6/gwYMHKzExUd27d5eTk5N69Oihdu3aXffQJ4B7z2Zw8B4AAMASnGMFAABgEYIVAACARQhWAAAAFiFYAQAAWIRgBQAAYBGCFQAAgEUIVgAAABYhWAEAAFiEYAUAAGARghUAAIBFCFYAAAAWIVgBAABY5P8Dsyef2/bBPVwAAAAASUVORK5CYII=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGwCAYAAAC0HlECAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPo0lEQVR4nO3de3zP9f//8dt72IGdHHfIMCmGIRJTichIaqWDQw41hEko1sphUU3kmPBxyPRBDoUPKlrLUObQWM4TphHDt7K3Qzaz/f7ostevd0OvN2Pvzf16ubwvl71ez+f7+X683rW9716v5/v5suTm5uYiIiIiItflVNgFiIiIiBQFCk0iIiIiJig0iYiIiJig0CQiIiJigkKTiIiIiAkKTSIiIiImKDSJiIiImFCysAsoLnJycjhx4gQeHh5YLJbCLkdERERMyM3N5dy5c/j7++PkdP1zSQpNBeTEiRMEBAQUdhkiIiJyA44dO0blypWv20ehqYB4eHgAf73pnp6ehVyNiIiImGG1WgkICDA+x69HoamA5F2S8/T0VGgSEREpYsxMrdFEcBERERETFJpERERETFBoEhERETFBc5rkjhATE8Py5cs5cOAAbm5uNGvWjA8++ICaNWsafWbNmsWiRYvYsWMH586d448//sDb29tmnCeffJLk5GROnz5N2bJlad26NR988AH+/v4AREdH88477+R7/dKlS3PhwgVje/LkycyYMYO0tDQqVKjAs88+S0xMDK6urrfmDRCHkpOTQ1ZWVmGXIXJHKFWqFCVKlCiQsSy5ubm5BTLSHc5qteLl5UVGRoYmgjugtm3b0qlTJxo3bkx2djZvvfUWe/bsYd++fZQpUwb4K8hcunQJgKioqKuGpkmTJhESEoKfnx+//vorb7zxBgCbN28G4Pz585w/f97mOa1ataJx48bExsYCsGjRIl5++WU++eQTmjVrxsGDB+nZsyedOnVi4sSJt/BdEEeQlZVFamoqOTk5hV2KyB3D29sbX1/fq072tufzW6GpgCg0FS1nzpyhUqVKbNiwgebNm9u0JSQk0LJly6uGpn9atWoVYWFhZGZmUqpUqXztP/30Ew0aNGDjxo08/PDDAAwYMID9+/cTHx9v9Hv99dfZunUr33///c0fnDis3Nxc0tLSuHz5sqmF9ETk5uTm5nLx4kVOnz6Nt7c3fn5++frY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Y8YQFxfHRx99xPTp01myZAk5OTnMmTPHOOszb948vL29SUhIoE2bNowaNYoJEybwzDPPABAYGMi+ffv4z3/+Q48ePVi0aBE5OTnMnTsXV1dX6tSpw/Hjx22CjFmXLl3i008/5a677gLgo48+on379kyYMOGq70HXrl2ZMGECaWlpVKlShZycHBYvXszw4cON98fX15fWrVtTqlQpqlSpwgMPPGB3XQMGDKBjx47AX/NB165dy9y5cxk2bBilSpWymfsZGBhIYmIiS5cutQlNZcuWZdq0aZQoUYJatWrRvn174uPj6d27NwcPHuTrr79m27ZtNG7cGIC5c+cSFBRkU8ffJ4RXq1aNd999l759+xqhKS0tjY4dO9qcpbzVdHlORESuaf/+/WRmZtKqVaubGqNJkyY2+/75jVMzevbsSXJyMjVr1mTgwIF88803+fr8c9yQkBD2798P/HUvyEOHDuHh4YG7uzvu7u6UK1eOS5cucfjwYS5cuMDhw4cJDw832t3d3Xn33Xc5fPiwcSz16tXD1dX1po4FoEqVKkZgyhsnJyeHlJSUq/Zv0KABQUFBLFq0CIANGzZw+vRpnnvuOeCvwPjnn39SvXp1evfuzYoVK8jOzra7rr8fT8mSJbn//vuN9xDg448/plGjRlSsWBF3d3dmzZpFWlqazRh16tSx+SKMn5+fcSZp//79lCxZkkaNGhnttWrVyndJ89tvv6VVq1bcddddeHh40K1bN3777TcuXrwIwMCBA3n33Xd58MEHGTVqFLt27bL7WO2l0CQiIteUtyTHteStOfb3L1vc7K0qrqVhw4akpqYyZswY/vzzT55//nmeffZZ088/f/48jRo1Ijk52eZx8OBBunTpYsyXmT17tk37nj172LJli+nXcXJyyvflk4J6T7p27WqEpkWLFtG2bVvjLF1AQAApKSlMnz4dNzc3+vfvT/PmzQv0v8fixYt54403CA8P55tvviE5OZmXXnqJrKwsm37/vB+nxWIx1rUz4+jRozzxxBPUq1ePL774gqSkJD7++GMA47V69erFkSNH6NatG7t37+b+++/no48+uskjvD6FJhERuaZ77rkHNzc34uPjr9qeN/fo5MmTxr7k5GSbPkFBQWzdutVmnz0h5O88PT154YUXmD17NkuWLOGLL77g999/v+a4W7ZsMS77NGzYkJ9//plK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yWu/GhcXFzw9PW0eIiIiUnwVqdB0/PhxfvvtN/z8/AAICQnh7NmzJCUlGX2+++47cnJyaNKkidFn48aNXL582egTFxdHzZo1KVu2rNEnPj7e5rXi4uIICQm51YckIiIiRUShhqbz58+TnJxMcnIyAKmpqSQnJ5OWlsb58+cZOnQoW7Zs4ejRo8THx/PUU09Ro0YNQkNDAQgKCqJt27b07t2bbdu28cMPPzBgwAA6deqEv78/AF26dMHZ2Znw8HD27t3LkiVLmDJlis2ltddee421a9cyYcIEDhw4QHR0ND/++CMDBgy47e+JiIiIOKZCXXIgISGBli1b5tvfo0cPZsyYQVhYGDt37uTs2bP4+/vTpk0bxowZYzNp+/fff2fAgAGsXr0aJycnOnbsyNSpU3F3dzf67Nq1i4iICLZv306FChV49dVXiYyMtHnNZcuWMXz4cI4ePco999zDuHHjePzxx00fi5YckDuFlhwQkeLEns9vh1mnqahTaJI7hUKTiBQnxWqdJhERERFHoNAkIiIiYoJCk4iIiIgJdoWm7OxsRo8ezfHjx29VPSIiIiIOya7QVLJkScaPH092dvatqkdERETEIdl9ee7RRx9lw4YNt6IWEREREYdl973n2rVrx5tvvsnu3btp1KgRZcqUsWl/8sknC6w4EREREUdh9zpNTk7XPjllsVi4cuXKTRdVFGmdJrlTaJ0mESlO7Pn8tvtMU05Ozg0XJiIiIlJUackBERERERNuKDRt2LCBDh06UKNGDWrUqMGTTz7Jpk2bCro2EREREYdhd2hasGABrVu3pnTp0gwcOJCBAwfi5uZGq1atWLRo0a2oUURERKTQ2T0RPCgoiD59+jB48GCb/RMnTmT27Nns37+/QAssKjQRXO4UmgguIsXJLb1h75EjR+jQoUO+/U8++SSpqan2DiciIiJSJNgdmgICAoiPj8+3/9tvvyUgIKBAihIRERFxNHYvOfD6668zcOBAkpOTadasGQA//PADsbGxTJkypcALFBEREXEEdoemfv364evry4QJE1i6dCnw1zynJUuW8NRTTxV4gSIiIiKOwO7QBPD000/z9NNPF3QtIiIiIg7L7jlN1atX57fffsu3/+zZs1SvXr1AihIRERFxNHaHpqNHj171/nKZmZn8+uuvBVKUiIiIiKMxfXlu1apVxs/r1q3Dy8vL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pIiIiEhhMx2aKlSowMaNG8nIyMDd3Z0SJUrYtC9btgx3d/cCL1BERETEEdi9IriXl9dV95crV+6mixERERFxVFoRXERERMQEhSYRERERExw+NFWrVg2LxZLvERERAUCLFi3ytfXt29dmjLS0NNq3b0/p0qWpVKkSQ4cOJTs726ZPQkICDRs2xMXFhRo1ahAbG3u7DlFERESKALvnNN1u27dv58qVK8b2nj17eOyxx3juueeMfb1792b06NHGdunSpY2fr1y5Qvv27fH19WXz5s2cPHmS7t27U6pUKd5//30AUlNTad++PX379mXhwoXEx8fTq1cv/Pz8CA0NvQ1HKSIiIo7O4UNTxYoVbbbHjh3L3XffzSOPPGLsK126NL6+vld9/jfffMO+ffv49ttv8fHxoUGDBowZM4bIyEiio6NxdnZm5syZBAYGMmHCBACCgoL4/vvvmTRp0jVDU2Zmps0Niq1W680eqoiIiDgwh78893dZWVksWLCAl19+GYvFYuxfuHAhFSpUoG7dukRFRXHx4kWjLTExkeDgYJtbwISGhmK1Wo0bECcmJtK6dWub1woNDSUxMfGatcTExODl5WU8AgICCuowRURExAE5/Jmmv1u5ciVnz56lZ8+exr4uXbpQtWpV/P392bVrF5GRkaSkpLB8+XIA0tPTbQITYGynp6dft4/VauXPP//Ezc0tXy1RUVEMGTLE2LZarQpOIiIixViRCk1z586lXbt2+Pv7G/v69Olj/BwcHIyfnx+tWrXi8OHDt/S2Li4uLri4uNyy8UVERMSxFJnLc7/88gvffvstvXr1um6/Jk2aAHDo0CEAfH19OXXqlE2fvO28eVDX6uPp6XnVs0wiIiJy5ykyoWnevHlUqlSJ9u3bX7dfcnIyAH5+fgCEhISwe/duTp8+bfSJi4vD09OT2rVrG33i4+NtxomLiyMkJKQAj0BERESKsiIRmnJycpg3bx49evSgZMn/f0Xx8OHDjBkzhqSkJI4ePcqqVavo3r07zZs3p169egC0adOG2rVr061bN3766SfWrVvH8OHDiYiIMC6v9e3blyNHjjBs2DAOHDjA9OnTWbp0KYMHDy6U4xURERHHUyRC07fffktaWhovv/yyzX5nZ2e+/fZb2rRpQ61atXj99dfp2LEjq1evNvqUKFGCNWvWUKJECUJCQnjxxRfp3r27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uHjxotGWmJhIcHCwEZgAQkNDsVqt7N271+jTunVrmzFDQ0NJTEy8Zi2ZmZlYrVabh4iIiBRfJQu7ALNycnIYNGgQDz74IHXr1jX2d+nShapVq+Lv78+uXbuIjIwkJSWF5cuXA5Cenm4TmABjOz09/bp9rFYrf/75J25ubvnqiYmJ4Z133inQYxQRERHHVWRCU0REBHv27OH777+32d+nTx/j5+DgYPz8/GjVqhWHDx/m7rvvvmX1REVFMWTIEGPbarUSEBBwy15PRERECleRuDw3YMAA1qxZw/r166lcufJ1+zZp0gSAQ4cOAeDr68upU6ds+uRt+/r6XrePp6fnVc8yAbi4uODp6WnzEBERkeLLoUNTbm4uAwYMYMWKFXz33XcEBgb+63OSk5MB8PPzAyAkJITdu3dz+vRpo09cXByenp7Url3b6BMfH28zTlxcHCEhIQV0JCIiIlLUOXRoioiIYMGCBSxatAgPDw/S09NJT0/nzz//BODw4cOMGTOGpKQkjh49yqpVq+jevTvNmzenXr16ALRp04batWvTrVs3fvrpJ9atW8fw4cOJiIjAxcUFgL59+3LkyBGGDRvGgQMHmD59OkuXLmXw4MGFduwiIiLiWBx6yQGL5erfZZ83bx49e/bk2LFjvPjii+zZs4cLFy4QEBDA008/zfDhw20ul/3yyy/069ePhIQEypQpQ48ePRg7diwlS/7/KV0JCQkMHjyYffv2UblyZUaMGEHPnj1N16olB+ROoSUHRKQ4sefz26FDU1Gi0CR3CoUmESlOiu06TSIiIiKFRaFJRERExASFJhERERETFJpERERETFBoEhERETFBoUlERETEBIUmERERERMUmkRERERMUGgSERERMUGhSURERMQEhSYRERERExSaRERERExQaBIRERExQaFJRERExASFJhERERETFJpERERETFBoEhERETFBoUlERETEBIUmERERERMUmkRERERMUGgSERERMUGhSURE7jgzZsygXr16eHp64unpSUhICF9//TUAR48exWKxXPWxbNmyQq5cClPJwi5ARETkdqtcuTJjx47lnnvuITc3l/nz5/PUU0+xc+dOatWqxcmTJ236z5o1i/Hjx9OuXbtCqlgcgUKTiIjccTp06GCz/d577zFjxgy2bNlCnTp18PX1tWlfsWIFzz//PO7u7rezTHEw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vLy8TI9Tr149jh8/zsGDB2+6JhGB2rVrc+HCBeCv0HPlypVb8jo1a9Zk9+7dNvOp/j5vSooHhSYptoKDg+natStTp0419rVo0YIzZ84wbtw4Dh8+zMcff8zXX39906/VtWtXKlSowFNPPcWmTZtITU0lISGBgQMH2jUh/ZFHHqF58+Z07NiRuLg4UlNT+frrr1m7du1N1yhSnP322288+uijLFiwgF27dpGamsqyZcsYN24cTz31FPDXN+Di4+NJT0/njz/+KNDX79KlCzk5OfTp04f9+/ezbt06PvzwQwCHXidO7KPQJMXa6NGjbU6fBwUFMX36dD7++GPq16/Ptm3beOONN276dUqXLs3GjRupUqUKzzzzDEFBQYSHh3Pp0iU8PT3tGuuLL76gcePGdO7cmdq1azNs2LBb9q9jkeLC3d2dJk2aMGnSJJo3b07dunUZMWIEvXv3Ztq0acBf336Li4sjICCA++67r0Bf39PTk9WrV5OcnEyDBg14++23GTlyJIDNPCcp2iy5/5zgISIiIjdt4cKFvPTSS2RkZGi+YjGhieAiIiIF4NNPP6V69ercdddd/PTTT0RGRvL8888rMBUjCk0iIiIFID09nZEjR5Keno6fnx/PPfcc7733XmGXJQVIl+dERERETNBEcBERERETFJpERERETFBoEhERETFBoUlERETEBIUmERERERMUmkREClh0dDQNGjS46XGqVavG5MmTb3ocESkYCk0iUmS0aNGCQYMG5dsfGxuLt7e3sR0dHY3FYsFisVCyZEkqVKhA8+bNmTx5ss0NVfPGzOv790d2dvZVa/jnawHs37+fgIAAnnvuObKysnjjjTeIj4+/2cMVEQej0CQixVKdOnU4efIkaWlprF+/nueee46YmBiaNWvGuXPnbPr27t2bkydP2jxKljS39u/27dt5+OGHadu2LUuWLMHZ2Rl3d3fKly9/Kw5LRAqRQpOIFEslS5bE19cXf39/goODefXVV9mwYQN79uzhgw8+sOlbunRpfH19bR5mfPfddzz66KOEh4cze/ZsnJz++pP6z8tzPXv2JCwsjA8//BA/Pz/Kly9PREQEly9fNvqcPn2aDh064ObmRmBgIAsXLrz5N0FECpRCk4jcMWrVqkW7du1Yvnz5TY+1YsUK2rdvz/Dhw/OFsKtZv349hw8fZv369cyfP5/Y2FhiY2ON9p49e3Ls2DHWr1/P559/zvTp0zl9+vRN1ykiBUehSUTuKLVq1eLo0aM2+6ZPn467u7vxeP311687xvnz53nuuecYOnQokZGRpl63bNmyTJs2jVq1avHEE0/Qvn17Y97TwYMH+frrr5k9ezZNmzalUaNGzJ07lz///POGjlFEbg3dsFdE7ii5ublYLBabfV27duXtt982tv850fuf3NzceOihh5g9ezadO3cmKCjoX1+3Tp06lChRwtj28/Nj9+7dwF8TyUuWLEmjRo2M9lq1av1rHSJye+lMk4gUGZ6enmRkZOTbf/bsWby8vEyNsX//fgIDA232eXl5UaNGDeNRoUKF645RokQJVq5cScOGDWnZsiX79+//19ctVaqUzbbFYiEnJ8dUzSLiGBSaRKTIqFmzJjt27Mi3f8eOHdx7773/+vwDBw6wdu1aOnbseNO1uLi4sHz5cho3bkzLli3Zt2/fDY9Vq1YtsrOzSUpKMvalpKRw9uzZm65TRAqOQpOIFBn9+vXj4MGDDBw4kF27dpGSksLEiRP57LPP8s1Dys7OJj09nRMnTrB7924++ugjHnnkERo0aMDQoUMLpB4XFxe++OILmjRpQsuWLdm7d+8NjVOzZk3atm3LK6+8wtatW0lKSqJXr164ubkVSJ0iUjAUmkSkyKhevTobN27kwIEDtG7dmiZNmrB06VKWLVtG27Ztbfru3bsXPz8/qlSpQosWLVi6dClRUVFs2rQJd3f3AqvJ2dmZzz//nGbNmtGyZUv27NlzQ+PMmzcPf39/HnnkEZ555hn69OlDpUqVCqxOEbl5ltzc3NzCLkJERETE0elMk4iIiIgJCk0iIiIiJig0iYiIiJig0CQiIiJigkKTiIiIiAkKTSIiIiImKDSJiIiImKDQJCIiImKCQpOIiIiICQpNIiIiIiYoNImIiIiY8P8AmHo6JI0unIIAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -1346,15 +1376,7 @@ } ], "source": [ - "ax = performance_df.plot.bar(\n", - " color=\"#7400ff\",\n", - " ylim=(1, 100000),\n", - " rot=0,\n", - " xlabel=\"UDF Kind\",\n", - " ylabel=\"Speedup factor\",\n", - ")\n", - "ax.bar_label(ax.containers[0], fmt=\"%.0f\")\n", - "plt.show()" + "performance_plot(performance_df, xlabel=\"UDF Kind\")" ] }, { @@ -1366,13 +1388,22 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "num_rows = 100_000_000\n", + "timeit_number = 10" + ] + }, + { + "cell_type": "code", + "execution_count": 36, "metadata": { "tags": [] }, "outputs": [], "source": [ - "num_rows = 100_000_000\n", "pdf = pd.DataFrame()\n", "pdf[\"key\"] = np.random.randint(0, 2, num_rows)\n", "pdf[\"val\"] = np.random.randint(0, 7, num_rows)\n", @@ -1388,23 +1419,50 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 37, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", + "/tmp/ipykernel_948063/2864685541.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n", + " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n" + ] + } + ], "source": [ "pandas_udf_groupby, cudf_udf_groupby = timeit_pandas_cudf(\n", " pdf,\n", " gdf,\n", " lambda df: df.groupby([\"key\"], group_keys=False).apply(custom_formula_udf),\n", - " number=10,\n", + " number=timeit_number,\n", ")" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 38, "metadata": { "tags": [] }, @@ -1436,7 +1494,7 @@ " \n", " \n", " Grouped UDF\n", - " 423.83606\n", + " 88.879055\n", " \n", " \n", "\n", @@ -1444,10 +1502,10 @@ ], "text/plain": [ " cudf speedup vs. pandas\n", - "Grouped UDF 423.83606" + "Grouped UDF 88.879055" ] }, - "execution_count": 44, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1462,14 +1520,12 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "tags": [] - }, + "execution_count": 39, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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4MCB6tWrl1599VXVrFlTfn5+GjZsmC5evGgfk5GRoe7du9v/nv79738XqicuLk7h4eHy8PBQcHCwhg4dqrNnz9r7jx8/ru7du6tatWry8PBQkyZN9PHHHxf5eJ1F2AEAC5s4caKmTZumSZMmad++fVqxYoUCAgKKvP1XX32lQYMGaejQoUpOTtb999+vKVOm2Pv79Omjzz//XNLlIJGWlqbg4OBC+5kzZ47Wrl2rVatW6cCBA1q+fLnq1q3rMGbSpEl6+OGH9c033+ivf/2rHnvsMe3fv1+SdP78ed1///3y9PTUF198oW3btsnT01NdunRRXl6eJGnRokX629/+ppdffln79+9XbGysJk2apCVLlkiSzp07p27duqlhw4ZKTExUTEyMxo4d69T3ecXhw4e1atUqffDBB/r000+VnJysYcOGXXVshQoV9OijjxYKBStWrFDbtm1Vr149rVmzRrNmzdKbb76pQ4cO6f3337eHSGeMGzdOY8aM0e7duxUZGakePXrYw+mV0LVq1Srt27dP//jHP/TCCy9o1apVDvvYtGmTjhw5ok2bNmnJkiWKj49XfHy8vX/gwIE6duyYNm7cqDVr1mjevHnKyMgodMxz5szRnj17tGTJEm3cuFHjx4+39w8bNky5ubn64osvlJKSomnTpsnT09Pp4y0yA5OVlWUkmaysrLIuBUA5lJOTY/bt22dycnIK9Y3VrX05Izs727i5uZlFixZdtX/Tpk1GksnMzLS37d6920gyqampxhhjHnvsMdOlSxeH7fr06WN8fHyuuc3VjBgxwvzpT38yBQUFV+2XZJ555hmHtoiICPPss88aY4xZvHixadiwocP2ubm5xt3d3Xz22WfGGGOCg4PNihUrHPbx0ksvmbZt2xpjjHnzzTeNr6+vOXfunL1//vz5RpLZvXu3McaYt956y+HYjDEmISHB/PrncvLkyaZixYrm5MmT9rZPPvnEVKhQwaSlpV31+JKSkozNZjPHjh0zxhhz6dIlU6tWLfPGG28YY4yZOXOmadCggcnLy7vq9jeSmppqJJlXXnnF3nbx4kVTu3ZtM23atGtuN3ToUPPwww/b3w8YMMDUqVPH5Ofn29seeeQR06dPH2OMMQcOHDCSzI4dO+z9+/fvN5LMrFmzrvk5q1atMn5+fvb34eHhJiYmpkjHdr1/f0X9/WZmBwAs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/YuzOQAAQKm7qbCzZs0arVq1SidOnFBeXp5DX1JSUokUBgAAUBKcvhprzpw5euKJJ1SjRg3t3r1bd999t/z8/HT06FF17dq1NGoEAAC4aU6HnXnz5mnhwoWaO3euXF1dNX78eK1fv14jR45UVlZWadQIAABw05wOOydOnFBkZKQkyd3dXWfOnJEkPf7443r77bdLtjoAAIBicjrsBAYG6qeffpIk1alTRzt27JB0+QGhxbiwCwAAoFQ4HXb+9Kc/6YMPPpAkDR48WM8995yioqLUp08fPfjggyVeIAAAQHE4fTXWwoULVVBQIEl65pln5Ovrq23btql79+565plnSrxAAACA4ijSzM5DDz2k7OxsSdLy5ct16dIle1/v3r01Z84cjRw5Uq6urqVTJQAAwE0qUtj58MMPde7cOUnSE088wVVXAADgtlGk01iNGjXSxIkTdf/998sYo1WrVl3ztsw8HwsAAJQnRXo21vbt2zV69GgdOXJEP//8s7y8vGSzFX64kM1m088//1wqhZYmno115+HZWIB18WysO0eJPhsrMjLSfol5hQoVdPDgQdWoUaNkKgUAAChFTl96npqaygNAAQDAbcPpS8/r1KlTGnUAAACUCqdndgAAAG4nhB0AAGBphB0AAGBpTq/ZuSIjI0MHDhyQzWZTgwYNuDoLAACUS07P7GRnZ+vxxx9XrVq11K5dO913332qVauW/vrXv3JnZQAAUO44HXaefPJJffXVV/rwww/1yy+/KCsrSx9++KF27dqlp556qjRqBAAAuGlOn8b66KOP9Nlnn+nee++1t3Xu3FmLFi1Sly5dSrQ4AACA4nJ6ZsfPz08+Pj6F2n18fFStWrUSKQoAAKCkOB12/v73v2v06NFKS0uzt6Wnp2vcuHGaNGlSiRYHAABQXE6fxpo/f74OHz6sOnXqKCQkRJJ04sQJubm56YcfftCbb75pH5uUlFRylQIAANwEp8NOr169SqEMAACA0uF02Jk8eXJp1AEAAFAquIMyAACwNKdndipUqCCbzXbN/kuXLhWrIAAAgJLkdNhJSEhweH/x4kXt3r1bS5Ys0YsvvlhihQEAAJQEp8NOz549C7X95S9/UZMmTfTOO+9o8ODBJVIYAABASSixNTsRERH6/PPPS2p3AAAAJaJEwk5OTo5ef/111a5duyR2BwAAUGKcPo1VrVo1hwXKxhidOXNGVapU0fLly0u0OAAAgOJyOuzMmjXLIexUqFBB/v7+ioiI4NlYAACg3HE67AwcOLAUygAAACgdRQo73377bZF32KxZs5suBgAAoKQVKey0aNFCNptNxhhJ4qaCAADgtlGkq7FSU1N19OhRpaam6r333lNoaKjmzZun3bt3a/fu3Zo3b57uuusuvfvuu6VdLwAAgFOKNLNTp04d+58feeQRzZkzR3/+85/tbc2aNVNwcLAmTZrEU9EBAEC54vR9dlJSUhQaGlqoPTQ0VPv27SuRogAAAEqK02GncePGmjJlii5cuGBvy83N1ZQpU9S4ceMSLQ4AAKC4nL70fMGCBerevbuCg4PVvHlzSdI333wjm82mDz/8sMQLBAAAKA6nw87dd9+t1NRULV++XN99952MMerTp4/69u0rDw+P0qgRAADgpjkddiSpSpUqevrpp0u6FgAAgBJ3Uw8CXbZsme69914FBQXp+PHjki4/RuI///lPiRYHAABQXE6Hnfnz52v06NHq2rWrMjMz7TcRrFatml577bWSrg8AAKBYnA47r7/+uhYtWqS//e1vcnH5v7NgrVu3VkpKSokWBwAAUFxOh53U1FS1bNmyULubm5vOnTtXIkUBAACUFKfDTmhoqJKTkwu1f/LJJ/rd735XEjUBAACUGKevxho3bpyGDRumCxcuyBijr7/+Wm+//bamTp2qf/7zn6VRIwAAwE1zOuw88cQTys/P1/jx43X+/Hn17dtXtWrV0uzZs/Xoo4+WRo0AAAA3zWaMMTe78Y8//qiCggLVqFGjJGu65bKzs+Xj46OsrCx5e3uXdTm4BcbZyroCAKVlxk3/quF2U9Tf75u6z05+fr4+//xzvfvuu3J3d5cknT59WmfPnr25agEAAEqJ06exjh8/ri5duujEiRPKzc1VVFSUvLy8NH36dF24cEELFiwojToBAABuitMzO6NGjVLr1q2VmZlpn9WRpAcffFAbNmwo0eIAAACKy+mZnW3btum///2vXF1dHdrr1Kmj77//vsQKAwAAKAlOz+wUFBTYHxHxa6dOnZKXl5dT+5o6dar+8Ic/yMvLSzVq1FCvXr104MABhzHGGMXExCgoKEju7u5q37699u7d6zAmNzdXI0aMUPXq1eXh4aEePXro1KlTzh4aAACwIKfDTlRUlMMzsGw2m86ePavJkyfrz3/+s1P72rJli4YNG6YdO3Zo/fr1ys/PV6dOnRzuxDx9+nTFxcVp7ty52rlzpwIDAxUVFaUzZ87Yx0RHRyshIUErV67Utm3bdPbsWXXr1u2qoQwAANxZnL70/PTp07r//vtVsWJFHTp0SK1bt9ahQ4dUvXp1ffHFF8W6DP2HH35QjRo1tGXLFt13330yxigoKEjR0dGaMGGCpMuzOAEBAZo2bZqGDBmirKws+fv7a9myZerTp4+9xuDgYH388cfq3LnzDT+XS8/vPFx6DlgXl57fOUrt0vOgoCAlJydr7NixGjJkiFq2bKlXXnlFu3fvLvb9drKysiRJvr6+ki4/hys9PV2dOnWyj3Fzc1O7du20fft2SVJiYqIuXrzoMCYoKEhNmza1j/mt3NxcZWdnO7wAAIA1Ob1AWZLc3d01aNAgDRo0qMQKMcZo9OjRuvfee9W0aVNJUnp6uiQpICDAYWxAQICOHz9uH+Pq6qpq1aoVGnNl+9+aOnWqXnzxxRKrHQAAlF83dVPBAwcOaPjw4erQoYM6duyo4cOH67vvvitWIcOHD9e3336rt99+u1CfzeZ4zsEYU6jtt643ZuLEicrKyrK/Tp48efOFAwCAcs3psLNmzRo1bdpUiYmJat68uZo1a6akpCSFh4dr9erVN1XEiBEjtHbtWm3atEm1a9e2twcGBkpSoRmajIwM+2xPYGCg8vLylJmZec0xv+Xm5iZvb2+HFwAAsCanw8748eM1ceJEffnll4qLi1NcXJy2b9+uF154wb6IuKiMMRo+fLjee+89bdy4UaGhoQ79oaGhCgwM1Pr16+1teXl52rJliyIjIyVJrVq1UqVKlRzGpKWlac+ePfYxAADgzuX0mp309HT179+/UPtf//pXzZgxw6l9DRs2TCtWrNB//vMfeXl52WdwfHx85O7uLpvNpujoaMXGxiosLExhYWGKjY1VlSpV1LdvX/vYwYMHa8yYMfLz85Ovr6/Gjh2r8PBwdezY0dnDAwAAFuN02Gnfvr22bt2q+vXrO7Rv27ZNf/zjH53a1/z58+37/LW33npLAwcOlHR5JiknJ0dDhw5VZmamIiIitG7dOocbGM6aNUsuLi7q3bu3cnJy1KFDB8XHx6tixYrOHh4AALAYp++zs2DBAv3jH/9Q79691aZNG0nSjh07tHr1ar344osKCgqyj+3Ro0fJVltKuM/OnYf77ADWxX127hxF/f12OuxUqFC0ZT42m+22uYMxYefOQ9gBrIuwc+co6u+306exCgoKilUYAADArXRT99kBAAC4XRQ57Hz11Vf65JNPHNqWLl2q0NBQ1ahRQ08//bRyc3NLvEAAAIDiKHLYiYmJ0bfffmt/n5KSosGDB6tjx456/vnn9cEHH2jq1KmlUiQAAMDNKnLYSU5OVocOHezvV65cqYiICC1atEijR4/WnDlztGrVqlIpEgAA4GYVOexkZmY6PH5hy5Yt6tKli/39H/7wB54xBQAAyp0ih52AgAClpqZKuvzIhqSkJLVt29bef+bMGVWqVKnkKwQAACiGIoedLl266Pnnn9fWrVs1ceJEValSxeGOyd9++63uuuuuUikSAADgZhX5PjtTpkzRQw89pHbt2snT01NLliyRq6urvf9f//qXOnXqVCpFAgAA3Kwihx1/f39t3bpVWVlZ8vT0LPTcqdWrV8vT07PECwQAACgOp++g7OPjc9V2X1/fYhcDAABQ0riDMgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsDTCDgAAsLQyDTtffPGFunfvrqCgINlsNr3//vsO/cYYxcTEKCgoSO7u7mrfvr327t3rMCY3N1cjRoxQ9erV5eHhoR49eujUqVO38CgAAEB5VqZh59y5c2revLnmzp171f7p06crLi5Oc+fO1c6dOxUYGKioqCidOXPGPiY6OloJCQlauXKltm3bprNnz6pbt266dOnSrToMAABQjtmMMaasi5Akm82mhIQE9erVS9LlWZ2goCBFR0drwoQJki7P4gQEBGjatGkaMmSIsrKy5O/vr2XLlqlPnz6SpNOnTys4OFgff/yxOnfuXKTPzs7Olo+Pj7KysuTt7V0qx4fyZZytrCsAUFpmlItfNdwKRf39LrdrdlJTU5Wenq5OnTrZ29zc3NSuXTtt375dkpSYmKiLFy86jAkKClLTpk3tY64mNzdX2dnZDi8AAGBN5TbspKenS5ICAgIc2gMCAux96enpcnV1VbVq1a455mqmTp0qHx8f+ys4OLiEqwcAAOVFuQ07V9hsjucbjDGF2n7rRmMmTpyorKws++vkyZMlUisAACh/ym3YCQwMlKRCMzQZGRn22Z7AwEDl5eUpMzPzmmOuxs3NTd7e3g4vAABgTeU27ISGhiowMFDr16+3t+Xl5WnLli2KjIyUJLVq1UqVKlVyGJOWlqY9e/bYxwAAgDubS1l++NmzZ3X48GH7+9TUVCUnJ8vX11chISGKjo5WbGyswsLCFBYWptjYWFWpUkV9+/aVJPn4+Gjw4MEaM2aM/Pz85Ovrq7Fjxyo8PFwdO3Ysq8MCAADlSJmGnV27dun++++3vx89erQkacCAAYqPj9f48eOVk5OjoUOHKjMzUxEREVq3bp28vLzs28yaNUsuLi7q3bu3cnJy1KFDB8XHx6tixYq3/HgAAED5U27us1OWuM/OnYf77ADWxX127hy3/X12AAAASgJhBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWJpLWRdQ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", + "image/png": "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UnBwcLF+4uPjtWzZMi1cuFDp6emaO3euQkND7c6JjY1Vly5dtH37dkVGRuqZZ55RWlqaJOns2bNq1aqVfH199cMPP2jdunXy8fFR69atVVhYKEmaO3euhg0bpjFjxigtLU1vvfWWYmNjbXevnTx5Uk8++aTuuOMOJScna8SIEXr99dcd+jwv2r17txYuXKjly5dr5cqV2rZtm/r163fJc11cXPS3v/1N8+bNs2ufO3euWrRooZo1a2rJkiWaOHGipk2bpszMTH322We2gOiIgQMH6rXXXtO2bdvUrFkztWvXzhY8LwaqRYsWadeuXRo2bJj+8Y9/aOHChXZ9rFq1Snv27NGqVas0e/ZszZo1S7NmzbId79Gjh3JycrRq1SotXrxYU6ZM0ZEjR4q95/j4eP3000+aPXu2/v3vf2vQoEG241FRUSooKND333+v1NRUjR07Vj4+Pg6/35Li0hJuONd7XgPMzbem1HKq5HnK+f8g5mwp+bknT53Qe5Pe08iB7+uRet2lY1JNz9tUs+H9ytkiHUm/cN6BbdIJ3ws/5/5/28Edkut/pLjh7+mhZq31t0cGSflSp+a367t712vNhpX/X4uXzuZWlSSdPVRdZy0BOnigeC0/bclWsH8d1fS8X5ZfLarpWVM169i/nzYPPaVWDXtL+VKfDqP0xWffKi52ssYMnqJPv/xEhaeLNPzv/5KlwCIVSCOjZ+rOhytp0fTVeqDp4/rn4OH6R9R4de7cWZIUFhamXbt2adq0aerevbvmzZunoqIizZgxQ56enqpXr54OHDigl156ybE/BElnzpzRnDlzdMstt0i6cHmzbdu2Gj9+vAICAoqdHxkZqfHjxys7O1shISEqKirSggULNHToUEkXLs8FBASoZcuWcnd3V0hIiO677z6H64qOjlaXLl0kXVi9euXKlZoxY4YGDRokd3d3vfnmm7Zzw8LCtGHDBi1cuFBdu3a1tVeuXFnvv/++XF1dFR4errZt2yopKUkvvviiMjIy9NVXX2nz5s269957JUkzZsxQRESEXR39+/e3/RwaGqrRo0fr73//u22ELDs7W126dLEbzStLjMgAgAnt3pemgsICtbj30avvIytNDes1sWu7p34zh/t56ske2pWZoof+WlfDxsXo+43fFDvnj/3eU7+Zdu+7MCKTlrld+w7sVsSDvgp/wEfhD/io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v18rV66Up6enEysHAADlgcX4/TK6N6D8/HxZrVbl5eXJz8/P2eXgOhhocXYFAMrKuzf0NxZ+r6Tf3+y1BAAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATIsgAwAATMvpQeaXX37Rs88+q6pVq8rLy0v169fXli1bbMcNw9CwYcMUGBgoLy8vtWzZUpmZmU6sGAAAlBdODTLHjh1TixYt5O7urq+++kq7du3S+PHjVblyZds577zzjuLj4zV16lRt2rRJ3t7eatWqlc6cOePEygEAQHng5swXHzt2rIKDgzVz5kxbW1hYmO1nwzA0adIkDR06VB06dJAkzZkzR/7+/vrss8/0zDPPXPeaAQBA+eHQiMy5c+c0cuRIHThwoFRefNmyZWrcuLGeeuop1ahRQ3fffbcSExNtx7OyspSbm6uWLVva2qxWq5o0aaINGzZcss+CggLl5+fbPQAAwI3JoSDj5uamd999V+fOnSuVF9+7d68SEhJUp04dff3113rppZcUExOj2bNnS5Jyc3MlSf7+/nbP8/f3tx37o7i4OFmtVtsjODi4VGoFAADlj8NzZB555BGtWbOmVF68qKhI99xzj9566y3dfffd6tOnj1588UVNnTr1qvscMmSI8vLybI+cnJxSqRUAAJQ/Ds+RadOmjQYPHqzU1FQ1atRI3t7edsfbt29f4r4C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MpJ04sQJubu7l36FAAAAl1HiIPPEE09o8ODB+uGHHzRkyBBVrFjRbiXfHTt26LbbbiuTIgEAAC6lxOvIjBo1Sp07d9aDDz4oHx8fzZ49WxUqVLAd//DDD/X444+XSZEAAACXUuIgU61aNX3//ffKy8uTj4+PXF1d7Y4vWrRIPj4+pV4gAADA5Ti8sq/Var1ke5UqVa65GAAAAEewsi8AADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtggwAADAtpwaZuLg43XvvvfL19VWNGjXUsWNHpaen251z5swZRUVFqWrVqvLx8VGXLl10+PBhJ1UMAADKE6cGmTVr1igqKkobN27Ut99+q7Nnz+rxxx/XqVOnbOe8+uqrWr58uRYtWqQ1a9bo4MGD6ty5sxOrBgAA5YXFMAzD2UVc9Ouvv6pGjRpas2aNHnjgAeXl5al69eqaN2+e/vrXv0qSfv75Z0VERGjDhg1q2rTpn/aZn58vq9WqvLw8+fn5lfVbQDkw0OLsCgCUlXfLzTcWylpJv7/L1RyZvLw8SVKVKlUkScnJyTp79qxatmxpOyc8PFwhISHasGHDJfsoKChQfn6+3QMAANyYyk2QKSoqUv/+/dWiRQvdeeedkqTc3FxVqFBBlSpVsjvX399fubm5l+wnLi5OVqvV9ggODi7r0gEAgJOUmyATFRWlnTt3asGCBdfUz5AhQ5SXl2d75OTklFKFAACgvHFzdgGSFB0drRUrVuj777/XrbfeamsPCAhQYWGhjh8/bjcqc/jwYQUEBFyyLw8PD3l4eJR1yQAAoBxw6oiMYRiKjo7W0qVL9e9//1thYWF2xxs1aiR3d3clJSXZ2tLT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AqCqVavqscce0/vvv283adYRERERWrdunV3bunXrdMcdd0j63506hw4dsh3//cTf39u4caPt52PHjikjI0MRERGSpHvuuUe7du1S7dq1iz0qVKig8PBwnTt3TsnJybY+0tPTbbdPX07dunX1008/FRt52rp1q8LCwv70rqwjR45o3rx56tixoy20ASh7/G0DIEmaMmWKzp07p8aNG+uTTz5RWlqa0tPT9fHHH+vnn3/+0zttBg4cqFmzZikhIUGZmZmaMGGCPv30U73++uuSLozqNG3aVG+//bbS0tK0Zs0aDR069JJ9jRw5UklJSdq5c6d69OihatWq2dZ4eeONN7R+/XpFR0crJSVFmZmZ+vzzz22TfevWravWrVurb9++2rRpk5KTk9W7d+9Ljir9XmRkpCwWi55//nklJydr9+7d+vDDDzVp0iS99tprducahqHc3FwdOnRIaWlp+vDDD9W8eXNZrVa9/fbbJfm4AZQWAwD+38GDB43o6GgjLCzMcHd3N3x8fIz77rvPePfdd41Tp07ZzpNkLF26tNjzp0yZYtSqVctwd3c3br/9dmPOnDl2x3ft2mU0a9bM8PLyMho2bGh88803hiRj1apVhmEYxqpVqwxJxvLly4169eoZFSpUMO677z5j+/btdv1s3rzZeOyxxwwfHx/D29vbaNCggTFmzBjb8UOHDhlt27Y1PDw8jJCQEGPOnDlGzZo1jYkTJ17x/aenpxudOnUygoKCDG9vb+Ouu+4yEhMTjaKiIts5M2fONCQZkgyLxWJYrVbjvvvuM0aOHGnk5eXZ9de9e3ejQ4cOV3xNANfGYhi/u2ANAE60evVqPfzwwzp27Nh1mZwLwPy4tAQAAEyLIAMAAEyLS0sAAMC0GJEBAACmRZABAACmRZABAACmRZABAACmRZABAACmRZABAACmRZABAACmRZABAACmRZABAACm9X888SQ4rrJ4lwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -1479,11 +1535,7 @@ } ], "source": [ - "ax = performance_df.plot.bar(\n", - " color=\"#7400ff\", ylim=(1, 500), rot=0, ylabel=\"Speedup factor\"\n", - ")\n", - "ax.bar_label(ax.containers[0], fmt=\"%.0f\")\n", - "plt.show()" + "performance_plot(performance_df)" ] }, { @@ -1502,71 +1554,78 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Architecture: x86_64\n", - "CPU op-mode(s): 32-bit, 64-bit\n", - "Byte Order: Little Endian\n", - "Address sizes: 46 bits physical, 48 bits virtual\n", - "CPU(s): 80\n", - "On-line CPU(s) list: 0-79\n", - "Thread(s) per core: 2\n", - "Core(s) per socket: 20\n", - "Socket(s): 2\n", - "NUMA node(s): 2\n", - "Vendor ID: GenuineIntel\n", - "CPU family: 6\n", - "Model: 85\n", - "Model name: Intel(R) Xeon(R) Gold 6230 CPU @ 2.10GHz\n", - "Stepping: 7\n", - "CPU MHz: 800.049\n", - "CPU max MHz: 3900.0000\n", - "CPU min MHz: 800.0000\n", - "BogoMIPS: 4200.00\n", - "Virtualization: VT-x\n", - "L1d cache: 1.3 MiB\n", - "L1i cache: 1.3 MiB\n", - "L2 cache: 40 MiB\n", - "L3 cache: 55 MiB\n", - "NUMA node0 CPU(s): 0-19,40-59\n", - "NUMA node1 CPU(s): 20-39,60-79\n", - "Vulnerability Itlb multihit: KVM: Mitigation: Split huge pages\n", - "Vulnerability L1tf: Not affected\n", - "Vulnerability Mds: Not affected\n", - "Vulnerability Meltdown: Not affected\n", - "Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled v\n", - " ia prctl and seccomp\n", - "Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user\n", - " pointer sanitization\n", - "Vulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RS\n", - " B filling\n", - "Vulnerability Srbds: Not affected\n", - "Vulnerability Tsx async abort: Mitigation; TSX disabled\n", - "Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtr\n", - " r pge mca cmov pat pse36 clflush dts acpi mmx f\n", - " xsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rd\n", - " tscp lm constant_tsc art arch_perfmon pebs bts \n", - " rep_good nopl xtopology nonstop_tsc cpuid aperf\n", - " mperf pni pclmulqdq dtes64 monitor ds_cpl vmx s\n", - " mx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid d\n", - " ca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadli\n", - " ne_timer aes xsave avx f16c rdrand lahf_lm abm \n", - " 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 inv\n", - " pcid_single intel_ppin ssbd mba ibrs ibpb stibp\n", - " ibrs_enhanced tpr_shadow vnmi flexpriority ept\n", - " vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep\n", - " bmi2 erms invpcid cqm mpx rdt_a avx512f avx512\n", - " dq rdseed adx smap clflushopt clwb intel_pt avx\n", - " 512cd avx512bw avx512vl xsaveopt xsavec xgetbv1\n", - " xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm\n", - " _mbm_local dtherm ida arat pln pts hwp hwp_act_\n", - " window hwp_epp hwp_pkg_req pku ospke avx512_vnn\n", - " i md_clear flush_l1d arch_capabilities\n" + "Architecture: x86_64\n", + " CPU op-mode(s): 32-bit, 64-bit\n", + " Address sizes: 52 bits physical, 57 bits virtual\n", + " Byte Order: Little Endian\n", + "CPU(s): 224\n", + " On-line CPU(s) list: 0-223\n", + "Vendor ID: GenuineIntel\n", + " Model name: Intel(R) Xeon(R) Platinum 8480CL\n", + " CPU family: 6\n", + " Model: 143\n", + " Thread(s) per core: 2\n", + " Core(s) per socket: 56\n", + " Socket(s): 2\n", + " Stepping: 7\n", + " CPU max MHz: 3800.0000\n", + " CPU min MHz: 800.0000\n", + " BogoMIPS: 4000.00\n", + " Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca\n", + " cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht\n", + " tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art ar\n", + " ch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc \n", + " cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 mon\n", + " itor ds_cpl smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pc\n", + " id dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_ti\n", + " mer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch \n", + " cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single inte\n", + " l_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced fsg\n", + " sbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rd\n", + " t_a avx512f avx512dq rdseed adx smap avx512ifma clflusho\n", + " pt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsave\n", + " opt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_\n", + " total cqm_mbm_local split_lock_detect avx_vnni avx512_bf\n", + " 16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window h\n", + " wp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx\n", + " 512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg\n", + " tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemot\n", + " e movdiri movdir64b enqcmd fsrm md_clear serialize tsxld\n", + " trk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_i\n", + " nt8 flush_l1d arch_capabilities\n", + "Caches (sum of all): \n", + " L1d: 5.3 MiB (112 instances)\n", + " L1i: 3.5 MiB (112 instances)\n", + " L2: 224 MiB (112 instances)\n", + " L3: 210 MiB (2 instances)\n", + "NUMA: \n", + " NUMA node(s): 2\n", + " NUMA node0 CPU(s): 0-55,112-167\n", + " NUMA node1 CPU(s): 56-111,168-223\n", + "Vulnerabilities: \n", + " Gather data sampling: Not affected\n", + " Itlb multihit: Not affected\n", + " L1tf: Not affected\n", + " Mds: Not affected\n", + " Meltdown: Not affected\n", + " Mmio stale data: Not affected\n", + " Retbleed: Not affected\n", + " Spec rstack overflow: Not affected\n", + " Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl \n", + " and seccomp\n", + " Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer \n", + " sanitization\n", + " Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\n", + " , PBRSB-eIBRS SW sequence\n", + " Srbds: Not affected\n", + " Tsx async abort: Not affected\n" ] } ], @@ -1583,27 +1642,51 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Mon Feb 6 17:43:52 2023 \n", + "Wed Mar 6 12:35:15 2024 \n", "+-----------------------------------------------------------------------------+\n", - "| NVIDIA-SMI 525.60.04 Driver Version: 525.60.04 CUDA Version: 12.0 |\n", + "| NVIDIA-SMI 525.147.05 Driver Version: 525.147.05 CUDA Version: 12.0 |\n", "|-------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|===============================+======================+======================|\n", - "| 0 H100 80GB HBM2e On | 00000000:1E:00.0 Off | 0 |\n", - "| N/A 30C P0 60W / 700W | 0MiB / 81559MiB | 0% Default |\n", + "| 0 NVIDIA H100 80G... On | 00000000:1B:00.0 Off | 0 |\n", + "| N/A 32C P0 119W / 700W | 44191MiB / 81559MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 1 NVIDIA H100 80G... On | 00000000:43:00.0 Off | 0 |\n", + "| N/A 31C P0 72W / 700W | 0MiB / 81559MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 2 NVIDIA H100 80G... On | 00000000:52:00.0 Off | 0 |\n", + "| N/A 34C P0 70W / 700W | 0MiB / 81559MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 3 NVIDIA H100 80G... On | 00000000:61:00.0 Off | 0 |\n", + "| N/A 34C P0 71W / 700W | 0MiB / 81559MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 4 NVIDIA H100 80G... On | 00000000:9D:00.0 Off | 0 |\n", + "| N/A 34C P0 121W / 700W | 3473MiB / 81559MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 5 NVIDIA H100 80G... On | 00000000:C3:00.0 Off | 0 |\n", + "| N/A 30C P0 72W / 700W | 0MiB / 81559MiB | 0% Default |\n", + "| | | Disabled |\n", + "+-------------------------------+----------------------+----------------------+\n", + "| 6 NVIDIA H100 80G... On | 00000000:D1:00.0 Off | 0 |\n", + "| N/A 32C P0 73W / 700W | 0MiB / 81559MiB | 0% Default |\n", "| | | Disabled |\n", "+-------------------------------+----------------------+----------------------+\n", - "| 1 H100 80GB HBM2e On | 00000000:22:00.0 Off | 0 |\n", - "| N/A 30C P0 60W / 700W | 0MiB / 81559MiB | 0% Default |\n", + "| 7 NVIDIA H100 80G... On | 00000000:DF:00.0 Off | 0 |\n", + "| N/A 35C P0 73W / 700W | 0MiB / 81559MiB | 0% Default |\n", "| | | Disabled |\n", "+-------------------------------+----------------------+----------------------+\n", " \n", @@ -1612,7 +1695,9 @@ "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=============================================================================|\n", - "| No running processes found |\n", + "| 0 N/A N/A 2218749 C ...onserver/bin/tritonserver 22062MiB |\n", + "| 0 N/A N/A 2343426 C ...onserver/bin/tritonserver 22122MiB |\n", + "| 4 N/A N/A 948063 C ...i/envs/cudfdev/bin/python 3468MiB |\n", "+-----------------------------------------------------------------------------+\n" ] } @@ -1620,6 +1705,13 @@ "source": [ "!nvidia-smi" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1638,7 +1730,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.8" }, "vscode": { "interpreter": {