Skip to content

Instantly share code, notes, and snippets.

@bilzard
Created November 18, 2022 11:15
Show Gist options
  • Save bilzard/d58b8c84a8f0125ab46970f9429b6580 to your computer and use it in GitHub Desktop.
Save bilzard/d58b8c84a8f0125ab46970f9429b6580 to your computer and use it in GitHub Desktop.
filter演算の速度比較
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "56ae9290-4ece-4fe3-8d25-c57b80dbc07e",
"metadata": {},
"source": [
"# listとnumpy arrayでfilter演算の速度を比較する\n",
"\n",
"以下の4つの書き方で速度を比較した。\n",
"\n",
"1. `result[:] = filter(<filter_func>, xs)`\n",
"2. `result[:] = (x for x in xs if <filter_cond>)`\n",
"3. `result[:] = [x for x in xs if <filter_cond>]`\n",
"4. `result = xs[<filter_cond>]`"
]
},
{
"cell_type": "code",
"execution_count": 131,
"id": "5a25ccfe-8c91-4aaf-98a2-4f23b72053b2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The lab_black extension is already loaded. To reload it, use:\n",
" %reload_ext lab_black\n"
]
}
],
"source": [
"%load_ext lab_black\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.style.use(\"ggplot\")"
]
},
{
"cell_type": "markdown",
"id": "f1b20d51-1e55-47f5-ab19-a37ee21c26c3",
"metadata": {},
"source": [
"c.f.) timeit -o:\n",
"https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-timeit"
]
},
{
"cell_type": "code",
"execution_count": 123,
"id": "0a3745a1-2cf3-4674-ab14-90896a015327",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.74 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"3.86 ms ± 6.22 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"3.67 ms ± 1.04 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"332 µs ± 183 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n"
]
}
],
"source": [
"sim_result = {}\n",
"\n",
"# filter\n",
"xs = np.random.randint(0, 256, 100_000)\n",
"result = []\n",
"sim_result[\"filter\"] = %timeit -o result[:] = filter(lambda x: x > 128, xs)\n",
"\n",
"# tuple comprehension\n",
"xs = np.random.randint(0, 256, 100_000)\n",
"result = []\n",
"sim_result[\"tuple comprehension\"] = %timeit -o result[:] = (x for x in xs if x > 128)\n",
"\n",
"# list comprehension\n",
"xs = np.random.randint(0, 256, 100_000)\n",
"result = []\n",
"sim_result[\"list comprehension\"] = %timeit -o result[:] = [x for x in xs if x > 128]\n",
"\n",
"# filter with numpy\n",
"xs = np.random.randint(0, 256, 100_000)\n",
"sim_result[\"numpy\"] = %timeit -o result = xs[xs > 128]"
]
},
{
"cell_type": "code",
"execution_count": 153,
"id": "6c85aec6-59de-47c5-9e5f-39bbbae880f6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>mean</th>\n",
" <th>std</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>filter</td>\n",
" <td>0.004742</td>\n",
" <td>1.040453e-04</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>tuple comprehension</td>\n",
" <td>0.003856</td>\n",
" <td>6.223687e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>list comprehension</td>\n",
" <td>0.003672</td>\n",
" <td>1.044400e-06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>numpy</td>\n",
" <td>0.000332</td>\n",
" <td>1.827475e-07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name mean std\n",
"0 filter 0.004742 1.040453e-04\n",
"1 tuple comprehension 0.003856 6.223687e-06\n",
"2 list comprehension 0.003672 1.044400e-06\n",
"3 numpy 0.000332 1.827475e-07"
]
},
"execution_count": 153,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = []\n",
"for sim, result in sim_result.items():\n",
" data.append(\n",
" {\n",
" \"name\": sim,\n",
" \"mean\": np.mean(np.array(result.all_runs) / result.loops),\n",
" \"std\": np.std(np.array(result.all_runs) / result.loops),\n",
" }\n",
" )\n",
"data = pd.DataFrame(data)\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": 154,
"id": "06fa5cdd-23aa-47a0-ab26-a127a3f856a4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0, 'algorithm'), Text(0, 0.5, 'Execution Time (sec)')]"
]
},
"execution_count": 154,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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HNmu2ImIiIio+xDJOZGl08rLyxWWcetKTa9M0kg7pHm63yVppV32qe6J/YnUTVt96mEhEolga2uL4uJizjFWMz09vXbffKfVOcZERERERPcLlRLjmTNn4tKlS0r35eXlYebMmZ0KioiIiIhI09Q+Ytzc3MynthARERHRA0ftiXFeXh6MjIzUXS0RERERUZdq96oUe/bswZ49e4TXy5cvb/Wwi/r6elRXVyusEEFERERE9CBod2IskUjg4OAA4NYqDNbW1q1GhvX09ODk5ITx48erN0oiIiIioi7W7sR4+PDhGD58OABg6dKlmDNnDuzt7bssMCIiIiIiTWp3Yny7Dz/8UN1xEBERERFplUqJcVZW1j3LeHp6qlI1EREREZFWqJQYL1269J5l4uLiVKmaiIiIiEgr1DaVoqamBr///juys7Px8ssvdzowIiIiIiJNUikxbmuaxNChQ/Htt9/i3Llz8PHx6UxcREREREQapfYHfAwePBjHjx9Xd7VERERERF1K7Ynx9evX0djYqO5qiYiIiIi6lEpTKSoqKlpta2howJ9//oktW7bA1dW104EREREREWmSSolxeHh4m/vs7Owwe/ZslQMiIiIiItIGlRLjefPmtdqmr68PS0tL9O3bFzo6ap+hQURERETUpVRKjEeOHKnmMIiIiIiItEulod2amhoUFRUp3VdUVISamppOBUVEREREpGkqJcYbNmxAUlKS0n27d+/G999/36mgiIiIiIg0TaXEODs7u80HeAwYMADZ2dmdiYmIiIiISONUSoxra2thbGysdF/Pnj05lYKIiIiIHjgqJcampqa4evWq0n1Xr15tM2kmIiIiIrpfqZQY+/j4YOfOna1uwCsuLkZiYiJ8fX3VEhwRERERkaaotFzbjBkzcPbsWbz99tvo168fzM3NUVlZiQsXLsDExATBwcHqjpOIiIiIqEuplBibm5sjKioKcXFxOHfuHDIzMyGRSPDUU08hODgY5ubm6o6TiIiIiKhLqZQYA7eSY2VPwCMiIiIiehB1+tnNRUVF+OOPP1BXV6eOeIiIiIiItELlEeMjR47g559/RlVVFQAgKioKLi4u+PLLL+Ht7Y0xY8aoLUgiIiIioq6m0ojxyZMnsW7dOjg7O+Pll19W2Ofi4oKTJ0+qJTgiIiIiIk1RKTFOTEzEyJEjsXjx4lYjw/b29igo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b60SYyMjI7z99tvQ0bl1L3htbS1iYmJgb2+Pd955RyhXWFiIPXv24MaNGzAyMmozPiKizmBiTESkBU1NTfjll19w7NgxlJSUoKmpSdhXWFjY5nF1dXXIy8vD008/LSTFANCjRw8MGjRIYfWK8+fPAwBGjhypUMcTTzyB9evX4/z58wqJce/eve+aFLeXSCTCoEGDFLb17t1biOd2vr6+QlIMAPb29gAgjES3cHBwAABUVFS0a6oJEZEqmBgTEWlBbGwsUlJSMHnyZHh6esLY2BgikQhff/016uvr2zzu+vXrkMvlMDMza7Xvzvm3165dg66uLiQSicJ2kUgEMzMz1NbWKmxXVqcq9PX1oa+vr7BNLBajoaGhVVljY+NW5e62XVkdRETqwsSYiEgLjh07hhEjRmDWrFkK22traxVuirtTz549IRKJWs0nBtBqm7GxMZqamlBTU6OQHMvlcshkMvTt21ehvEgk6viJEBF1I3zABxGRFohEIoWpEABw9uxZVFZW3vW4Hj16wMXFBWfOnEFjY6Owva6uDmfPnlUo6+XlBQA4evSowvZTp07hn3/+EfZ3VMsNe3cb2SYiehBxxJiISAsGDhyII0eOwN7eHr1790ZeXh6SkpIUVndoy8yZMxEVFYVPPvkEzzzzjLAqRY8ePXDt2jWhnLe3NwYMGICffvoJN2/ehLu7O65evYr4+Hg4OzvDz89Ppditra2hr6+PY8eOwd7eHj169IBUKoW5ublK9RER3S+YGBMRaUFYWBjEYjESExNRV1cHZ2dnLFq0CFu3br3nsT4+PnjrrbcQHx+PlStXwszMDAEBAaiqqlIYHRaJRHj77bexbds2HD58GDt27IBEIoGfn5/CmsIdZWBggHnz5iEhIQEff/wxmpqaWq1jTET0IBLJ5XK5toMgIqLOaWxsxDvvvANzc3N88MEH2g6HiOiBxBFjIqIH0Pr16+Ht7Q2pVAqZTIZ9+/ahsLAQoaGh2g6NiOiBxcSYiOgBdPPmTWzevBk1NTXQ1dWFi4sLIiMj4e3tre3QiIgeWJxKQUREREQELtdGRERERASAiTEREREREQAmxkREREREAJgYExEREREBYGJMRERERASAiTEREREREQAmxkREREREAJgYExEREREBAP4fPdIeIVFEATcAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 800x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"_, ax = plt.subplots(figsize=(8, 3))\n",
"ax.bar(data[\"name\"], data[\"mean\"], yerr=data[\"std\"], ecolor=\"black\", capsize=10)\n",
"ax.set(xlabel=\"algorithm\", ylabel=\"Execution Time (sec)\")"
]
},
{
"cell_type": "markdown",
"id": "10d6e0b4-9550-408c-a021-9a3381be8be6",
"metadata": {},
"source": [
"## 結果\n",
"\n",
"numpyが圧倒的に早かった(リスト内包と比較しても10倍以上)。list演算系ではリスト内包の書き方が最も早かった。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment