Skip to content

Instantly share code, notes, and snippets.

@yifeihuang
Last active December 28, 2020 10:31
Show Gist options
  • Save yifeihuang/69dfd7fa0c6effbf46dffc2af853067e to your computer and use it in GitHub Desktop.
Save yifeihuang/69dfd7fa0c6effbf46dffc2af853067e to your computer and use it in GitHub Desktop.
Parallelized apply for Pandas
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import concurrent.futures\n",
"import numpy as np\n",
"import pandas as pd\n",
"from functools import partial\n",
"import time"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.42 s ± 9.58 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"184 ms ± 776 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"df = pd.DataFrame(np.random.binomial(n=1000, p=0.2, size=(10000,2)))\n",
"\n",
"# a no op function that simulates a transformation that takes some time to complete\n",
"def do_work(row, duration):\n",
" time.sleep(duration)\n",
" return True\n",
"\n",
"FUNCTION_RUN_TIME = 0.0001\n",
"\n",
"# simple use of apply to execute the function against the pd dataframe\n",
"def serial_calc(df, duration):\n",
" apply_partial = partial(do_work, duration=duration)\n",
" df['result'] = df.apply(apply_partial, axis=1)\n",
" return df\n",
"\n",
"%timeit serial_calc(df, FUNCTION_RUN_TIME)\n",
"\n",
"# simple wrapper code around serial_calc to parallelize the work\n",
"def parallel_calc(df, func, n_core, duration):\n",
" futs = []\n",
" df_split = np.array_split(df, n_core)\n",
"# pool = concurrent.futures.ThreadPoolExecutor(max_workers = n_core)\n",
" pool = concurrent.futures.ProcessPoolExecutor(max_workers = n_core)\n",
" apply_partial = partial(func, duration=duration)\n",
" return pd.concat(pool.map(apply_partial, df_split))\n",
"\n",
"%timeit parallel_calc(df, serial_calc, 32, FUNCTION_RUN_TIME)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0QAAAHyCAYAAADLFQ5vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB7XUlEQVR4nOzdd5gUVdrG4d87Q845ZwQVJQcVSUbMYsCs4K45rHld9VsD6ppzwIDCGhEQlKAEJQiKCqio5DREyTnMMOH9/ugedhgm9UwPNeG5r6uvpk+dqnp6KIZ++1SdMndHRERERESkOIoJOoCIiIiIiEhQVBCJiIiIiEixpYJIRERERESKLRVEIiIiIiJSbKkgEhERERGRYksFkYiIiIiIFFslgg6QVzVq1PAmTZoEHUNERERERAqwOXPmbHb3munbC31B1KRJE2bPnh10DBERERERKcDMbGVG7TplTkREREREii0VRCIiIiIiUmypIBIRERERkWJLBZGIiIiIiBRbKohERERERKTYUkEkIiIiIiLFlgoiEREREREptlQQiYiIiIhIsVXob8waiYSEBLZu3cquXbtITk4OOo5IsRQbG0vFihWpVq0apUuXDjqOiIiIFHPFpiBKSEhg1apVVK1alSZNmlCyZEnMLOhYIsWKu5OYmMjOnTtZtWoVjRo1UlEkIiIigSo2p8xt3bqVqlWrUqNGDUqVKqViSCQAZkapUqWoUaMGVatWZevWrUFHEhERkWKu2BREu3btolKlSkHHEJGwSpUqsWvXrqBjiIiISDFXbAqi5ORkSpYsGXQMEQkrWbKkruUTERGRwBWbggjQaXIiBYj+PYqIiEhBUKwKIhERERERkbRUEImIiIiISLGlgqgYGj16NOeccw61atWidOnS1K1bl/PPP5/Ro0fn2z779++PmfHbb79FvG5cXBxmRp8+fXK8zk8//YSZYWb8/PPPEe8zr/LyfkVERETk8Ck29yGSkNtvv53XX3+dJk2acP7551OjRg3Wrl3LuHHjGD16NNdffz3vvPNO1Pfbp08fmjRpQp06daK+7Yx88MEHlClThoSEBAYNGkSXLl0Oy35FREREirtVW/by2uQlHFGrAjf2bB50nGypICpGpk6dyuuvv85FF13E0KFDKVHif3/9O3bs4KSTTuLdd9/l7LPP5vzzz4/qvvv06RPRCE9e7N+/n88++4yTTjqJLVu2MHToUF566SXKly9/WPYvIiIiUhyt3hoqhCbO38A1xzfmss6Ngo6UIzplrhgZO3YsALfddttBxRBA5cqVefrppwEYOXLkYc8WTePGjWPLli2cdtppXHjhhezatYvPPvss6FgiIiIiRdLqrXv51+e/c+7rM6hdqQxT7+3F3acfSeVyheOWNyqIipHExEQA/vjjjwyXd+/enWHDhnHXXXcd1O7uvPXWW3To0IGyZctStWpVzjvvPH799deD+g0ZMgQzY/jw4fTu3ZsyZcrQuHFjli9fnuE1NYmJibzyyiscf/zxVK5cmVKlStG4cWNuuukmNm3alOv3+cEHHwDQu3dvLrnkEgAGDRqUYd9evXrRoEEDVq5cybnnnkvFihWpXbs2V199NatWrTqob+p72LhxI1dffTVVqlShWrVq9OnTh3nz5mWZ6YgjjqBcuXIZ3oh0wIABmBmTJk3KzdsVERERCcSabXt5YGSoEKpeoRRT7unFPacfSZVypYKOFpFACyIz8xw8egWZsSg57bTTALj33nu5/fbbmTlz5kE3xixbtix9+/alXbt2B63Xr18/br75Zvbv389NN91E3759+e677+jatSuTJ08+ZD+33347mzZt4h//+AedO3emWbNmGea5/PLLufPOOylZsiQ33HADN954I2XKlOHtt9/mrLPOytV73LJlC1999RXHHnssrVq1omnTphx33HHMnDmT+fPnZ7jO3r17Oemkk1i0aBE33XQTnTp14qOPPqJr166sXbv2kP5nnnkmkydP5m9/+xunnnoqY8eO5cQTT2Tu3LmZ5rr66qvZt28fo0aNOmTZxx9/TP369TnllFNy9Z5FREREDqe12/fx4Kg/OOe1GVQtFyqE7ut9FFXLF65C6AB3D+wBPJrJ403AgQ1Anay20bFjR8+J+fPn56hfUXfzzTd7+GfrgFeqVMnPOussf+mll3z16tWH9B82bJgDfsUVV3hiYuKB9uXLl3u1atW8fv36npCQ4O7ugwcPdsAbNGjge/bsOWg7/fr1c8B//fVXd3efOXOmA37llVce1C8xMdFbt27tgC9atMjd3VesWOGAn3/++dm+v9dff90Bf/LJJw+0vfLKKw74XXfddUj/nj17OuCdO3f2vXv3Hmh//vnnHfB+/fod8h4aN27smzZtOtA+YsQIB7xnz56Z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YPjw4YwcOZIzzjiDWbNm8corrzBo0CDi4+N56qmn+OWXX0j7MzUzRowYwSuvvEK5cuUYNGgQn332Ga1atWLUqFHcf//9ucpy9tlnM3ToUJo3b85HH33EkCFDiI+P54033mD8+PEAfPXVVzna1hdffMGuXbs499xzD4xsZSZ1lGjQoEEHtY8fP566devy9ttvM2/ePO644w5mzJiR4fY++eQTOnTowPvvv8+MGTPo168fP/30U46L89RJHS688MJspycXERERiZbNuxP4z1cLOOWFaexPSmHCnT149LxjinUxBGCRzuSVLyHMegPjgUfcfUB2/dPq1KmTz549O9t+CxYs4Oijj85lQimqevXqxbRp09i2bRtVqlTJsm///v3573//y6+//kq7du1yvc933nmHG2+8kW+++YZTTjkl19spCvTvUkREJP9t2Z3AO9OXM/Tn1ZzXth63nNScupVzNitwUWJmc9y9U/r2gnLK3PHh5xmBphDJZzt27ODll1+mefPmnHzyyUHHERERkSJs6579vPPdcobOWsU5bery9R3dqVel+BVC2SkoBVH78PMvgaYQySfTpk3jrrvuYs2aNWzatIkPPvgg03sliYiIiOTFtj37eXf6cj75eRVnta7LuH90p74KoUwVlIKoObBPs8tJUVWvXj3++usvkpOTGTBggGaXExERkajbvjdUCH380yrOPLYuY2/vRoOqul45OwXlGqJ14Sx1I11X1xCJFF76dykiIpJ32/fu570ZK/jwx5WccUwdbj3pCBpWUyGUXoG+hsjd6wWdQURERESkMNmxN5H3Zizngx9X0rtVHcbc1k2FUC4UiIJIRERERERyZse+xNCI0Mw4Tj26NqNv7Uaj6iqEcksFkYiIiIhIIbAzPpH3Z6zgvz/EccrRtRl1y4k0qVE+6FiFngoiEREREZECbGd8IoNnxDHkhxWcdFQtFUJRpoJIRERERKQA2hWfyJDv4xj8Qxy9Wtbk85u70qxmhaBjFTkqiERERERECpDdCUkM+X4F738fR48WNRh+0wk0VyGUb1QQiYiIiIgUALsTkvjvD3G8P2MF3VrUYNiNJ3BELRVC+U0FkYiIiIhIgPYkJPHfmXG8N30FJx5Rg89uPJ4jalUMOlaxoYJIRERERCQAe/cn8cHMlQyavpzjm1Vn6A3H06K2CqHDLSboAHL4PProo5jZIY+SJUtSvXp1evXqxUcffRR0zAM5v/jiiwNtZka7du1ytb0hQ4ZgZrz88ssH2nr16oWZsX379jxlza127dphZhGt06pVK8yMW265JZ9SZW7q1KmYGXfeeedh37eIiEhRs3d/Em9PW0aPZ6fyx9odfHL98bx+RQcVQwHRCFExdP755x9UXCQlJbFx40aGDRvG1VdfzcKFC3niiSeCC3gY9O/fn169elGmTJmgo+TIrFmzWLBgAeXKleOTTz7hhRdeoGzZskHHEhERkQjs25/MRz+u5O3vltOlaVU+vu44jqyjIihoKoiKoT59+tC/f/9D2u+77z7at2/P008/zfXXX0/jxo0Pf7jDJKP3X5B98MEHmBn33Xcfjz32GMOHD+eaa64JOpaIiIjkwL79yXz8U6gQ6tS4Kh/+vQtH160UdCwJ0ylzckCLFi3o06cPycnJTJgwIeg4EpaYmMjQoUNp3bo1N954IzExMQwaNCjoWCIiIpKN+MRk3puxgp7PTWFW3Fb+e20XBl7VUcVQAaOCSA5Sv359ALZs2XKgbffu3Tz++OO0a9eOihUrUqZMGVq0aME///lP9uzZc6Bf6nUmAwcO5PLLL6ds2bLUrVuX77//HoCVK1dy880307x5c8qUKUOFChXo2LEjb731Vq6yujtvvfUWHTp0oGzZslStWpXzzjuPX3/9Ndt1019D1KRJkwyvr0p9pB1RimS/+/bt48EHH6RJkyaULVuW448/nu+++y6i9/nVV1+xefNmevfuTd26denevTvTp09n8eLFh/RNvV5qwoQJDBgwgPr161O+fHlOOOEExo4de1Df1L+vQYMG8eabb9K8eXPKlStH27ZtGTJkSJaZHn/88QPrprdy5UpiYmK48sorI3qfIiIiRUV8YjLvz1hBj2en8NPyLQy+tjNvX92JVvVUCBVEOmVODrJ06VLgf4VRUlISp556Kj///DO9e/emd+/e7Nq1i9GjR/Pcc8+xfPlyRowYcdA2HnvsMSpUqMDtt9/OvHnz6NChA3FxcXTu3Jk9e/Zw4YUX0rBhQ9auXcuIESO4+eabSUpK4rbbbosoa79+/fjwww855phjuOmmm9izZw/Dhg2ja9eujBs3jpNPPjnH27rzzjsznGDhjTfeYPPmzXTt2jXi/aakpHDmmWcybdo0unTpwoUXXsisWbM4/fTTKVeuXI6zffDBBwBceumlAFx22WVMmzaNQYMG8eyzz2a4zoMPPsj8+fO58soriY2NZcSIEZx33nm89957XHvttQf1HThwIHPnzuWSSy6hWrVqfPHFF1x77bXExcXx6KOPZrj9q6++mkceeYRPPvmE66677qBlH3/8Me6uU/pERKTYiU9MZujPqxg4bRmt61fh/f6dObZ+5aBjSXbcvVA/Onbs6Dkxf/78HPUryh555BEHfPDgwRkunzVrlpcoUcLLli3rGzdudHf3Tz/91AF/6KGHDuq7c+dOr127tsfGxvqePXvc3X3KlCkOeLly5fyvv/46qP+NN97ogE+aNOmg9p9++skBP+GEEw7JOWrUqANtgLdt2/bA62HDhjngV1xxhScmJh5oX758uVerVs3r16/vCQkJ7u4+ePBgB/yll1460K9nz54O+LZt2zL9eT377LMOeL9+/XK13/fff98B/9vf/ubJyckH+t53330OeOifX9a2bt3qpUqV8hYtWhxo27x5s5csWdJr167t+/fvP6h/6nuNjY31mTNnHmhfunSpV6lSxStXrnzgPaf+fQE+fPjwA303bNjgzZo18xIlSvjixYsP6nvHHXcc6NejRw+PiYnxdevWHZShVatWXqdOHU9KSsr2/enfpYiIFAX79if5kO9X+HFPfuN/H/Kz/756e9CRJAPAbM+gntApc8XQF198waOPPnrg8dBDD9G3b1+6d+9OUlISzz//PDVr1gSgQ4cODBo06JDplitWrEiHDh1ITk5m69atBy078cQTqVOnzkFtV111Fe+//z6nnnrqQe1dunShbNmybNy4MaL38N577wHw8ssvU6LE/wY6mzZtys0338zatWuZNGlSRNtM6+uvv+Zf//rXIaf0RbLfTz/9FDPjqaeeIibmf//UHn/8cSpXztm3RZ999hn79+/n8ssvP9BWvXp1Tj/9dDZs2MCYMWMyXO+yyy7j+OOPP/C6efPm3HbbbezYsYNx48Yd1PfEE0/k4osvPvC6Vq1aPPjggyQlJTFs2LBMs/Xr14+UlBSGDh16oO3XX39l/vz5XHHFFcTGxuboPYqIiBRWCUnJfDgzjpOen8q0xZt455qODOrXmdYNNCpUmOiUuVSPFoID99EdUdnMl19+yZdffnngdcmSJalRowann346t956K6effvqBZS1btqRly5bEx8fz008/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\n",
"text/plain": [
"<Figure size 1008x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"function_time = []\n",
"non_parallel_time = []\n",
"parallel_time = []\n",
"\n",
"for d in range(11):\n",
"# print(d)\n",
" d_ms = d/20000\n",
" function_time.append(d_ms)\n",
" start = time.time()\n",
" serial_calc(df, d_ms)\n",
" end = time.time()\n",
" non_parallel_time.append(end-start)\n",
" \n",
" start = time.time()\n",
" parallel_calc(df, serial_calc, 32, d_ms)\n",
" end = time.time()\n",
" parallel_time.append(end-start)\n",
" \n",
"import matplotlib.pyplot as plt\n",
"\n",
"font = {'family' : 'Arial',\n",
" 'weight': 'normal',\n",
" 'size' : 20}\n",
"\n",
"plt.rc('font', **font)\n",
"\n",
"fig, ax = plt.subplots(figsize=(14,8))\n",
"plt.xlabel('Function run time (ms)')\n",
"plt.ylabel('Overall processing time (s)')\n",
"\n",
"x = [t*1000 for t in function_time]\n",
"\n",
"ax.plot(x, non_parallel_time, '-', linewidth=1)\n",
"ax.plot(x, parallel_time, '-', linewidth=1)\n",
"ax.legend(['Serial Apply', 'Parallelized Apply'])\n",
"\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment