NumericalMethods/HW1/5678.ipynb
mgoloshchapov c4b9b2e771 HW1
2022-09-18 18:46:06 +03:00

1027 lines
217 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 91,
"id": "54634e7b",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from numba import jit\n",
"import itertools\n",
"\n",
"fontsize=14"
]
},
{
"cell_type": "markdown",
"id": "8e090825",
"metadata": {},
"source": [
"__В pdf-файле задачи 1-4__"
]
},
{
"cell_type": "code",
"execution_count": 374,
"id": "705fbec9",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"1000\"\n",
" height=\"800\"\n",
" src=\"HW1_14.pdf\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" \n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7ff362a4af20>"
]
},
"execution_count": 374,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import IFrame\n",
"IFrame(\"HW1_14.pdf\", width=1000, height=800)"
]
},
{
"cell_type": "markdown",
"id": "d4960afd",
"metadata": {},
"source": [
"### Задача 5 \n",
"\n",
"- сгенерируем s точек равномерно в квадрате стороной 2, оставим только те, для которых $|| x ||_p \\le 1, p=1,2,3$\n",
"- сравним реализацию с jit и без"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "55fc75ad",
"metadata": {},
"outputs": [],
"source": [
"@jit(nopython=True)\n",
"def numba_unit_disk(p=1, s=100000):\n",
" X_old, Y_old = np.random.uniform(-1.0, 1.0, s), np.random.uniform(-1.0, 1.0, s)\n",
" X_new, Y_new = [], []\n",
" \n",
" for x, y in zip(X_old, Y_old):\n",
" if (abs(x)**p + abs(y)**p)**(1/p) <= 1:\n",
" X_new.append(x)\n",
" Y_new.append(y)\n",
" return X_new, Y_new\n",
"\n",
"def unit_disk(p=1, s=100000):\n",
" X_old, Y_old = np.random.uniform(-1.0, 1.0, s), np.random.uniform(-1.0, 1.0, s)\n",
" \n",
" X_new, Y_new = [], []\n",
" for x, y in zip(X_old, Y_old):\n",
" if np.linalg.norm([x, y], ord=p) <= 1:\n",
" X_new.append(x)\n",
" Y_new.append(y)\n",
" return X_new, Y_new"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "108af16e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"for n in range(1, 4):\n",
" x, y = numba_unit_disk(n)\n",
" \n",
" plt.figure(figsize=(6,6))\n",
" plt.scatter(x, y, color=\"blue\")\n",
" plt.title(\"p = {}\".format(n), fontsize=fontsize)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "43ba0e12",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"759 ms ± 74.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"6.3 ms ± 1.44 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%timeit unit_disk()\n",
"%timeit numba_unit_disk()"
]
},
{
"cell_type": "markdown",
"id": "0b618b90",
"metadata": {},
"source": [
"__Вывод:__\n",
"- JIT крут, вычисления в 150-200 раз быстрее"
]
},
{
"cell_type": "markdown",
"id": "9aff9c18",
"metadata": {},
"source": [
"### Задача 6"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "74c4965f",
"metadata": {},
"outputs": [],
"source": [
"c = 3"
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "41852c3b",
"metadata": {},
"outputs": [],
"source": [
"# Generate some data\n",
"np.random.seed(42)\n",
"lambda1 = np.random.normal(size=(c, c))\n",
"lambda2 = np.random.normal(size=(c, c))\n",
"lambda3 = np.random.normal(size=(c, c))\n",
"G1 = np.random.normal(size=(c, c, c))\n",
"G2 = np.random.normal(size=(c, c, c))\n",
"U = np.random.normal(size=(c, c, c, c))"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "c72140e1",
"metadata": {},
"outputs": [],
"source": [
"def Z_naive(lambda1, lambda2, lambda3, G1, G2, U):\n",
" c = lambda1.shape[0]\n",
" Z = np.zeros(shape=(c, c, c, c))\n",
" for a, b, c, d, e, f, g, h, i, j in itertools.product(*([range(c)]*10)):\n",
" Z[a, h, i, j] += lambda1[a, b]*lambda2[d, e]*lambda3[g, h]*G1[c, b, d]*G2[f, e, g]*U[i, j, c, f]\n",
" return Z\n",
"\n",
"def Z(lambda1, lambda2, lambda3, G1, G2, U):\n",
" return np.einsum(\"ab,cbd,de,feg,gh,ijcf->ahij\", lambda1, G1, lambda2, G2, lambda3, U, optimize=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "a4ba9f23",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"615 µs ± 144 µs per loop (mean ± std. dev. of 2 runs, 10 loops each)\n"
]
}
],
"source": [
"# %timeit -n 2 -r 2 Z_naive(lambda1, lambda2, lambda3, G1, G2, U)\n",
"%timeit -n 10 -r 2 Z(lambda1, lambda2, lambda3, G1, G2, U)"
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "19913a61",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3, 3, 3, 3)\n",
"(3, 3, 3, 3)\n"
]
}
],
"source": [
"print(Z_naive(lambda1, lambda2, lambda3, G1, G2, U).shape)\n",
"print(Z(lambda1, lambda2, lambda3, G1, G2, U).shape)"
]
},
{
"cell_type": "code",
"execution_count": 97,
"id": "860ebc25",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.99716543697806e-26\n"
]
}
],
"source": [
"print((np.sum(Z(lambda1, lambda2, lambda3, G1, G2, U) - Z_naive(lambda1, lambda2, lambda3, G1, G2, U))**2))"
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "15b20588",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['einsum_path', (0, 1), (0, 1), (0, 3), (1, 2), (0, 1)] Complete contraction: ab,cbd,de,feg,gh,ijcf->ahij\n",
" Naive scaling: 10\n",
" Optimized scaling: 6\n",
" Naive FLOP count: 3.543e+05\n",
" Optimized FLOP count: 2.431e+03\n",
" Theoretical speedup: 145.740\n",
" Largest intermediate: 8.100e+01 elements\n",
"--------------------------------------------------------------------------\n",
"scaling current remaining\n",
"--------------------------------------------------------------------------\n",
" 4 cbd,ab->acd de,feg,gh,ijcf,acd->ahij\n",
" 4 feg,de->dfg gh,ijcf,acd,dfg->ahij\n",
" 4 dfg,gh->dfh ijcf,acd,dfh->ahij\n",
" 5 dfh,acd->acfh ijcf,acfh->ahij\n",
" 6 acfh,ijcf->ahij ahij->ahij\n"
]
}
],
"source": [
"print(*np.einsum_path(\"ab,cbd,de,feg,gh,ijcf->ahij\", lambda1, G1, lambda2, G2, lambda3, U, optimize=True))"
]
},
{
"cell_type": "markdown",
"id": "87ec392f",
"metadata": {},
"source": [
"__np.einsum__ вычисляет свёртку тензоров, причём разбивает суммирование на несколько этапов:\n",
" \n",
"- вычисляет части свёртки по отдельности, создаёт промежуточные массивы(тензоры)\n",
"- вычисляет свёртку от новых тензоров"
]
},
{
"cell_type": "markdown",
"id": "2359e3ae",
"metadata": {},
"source": [
"__Наивный способ__\n",
"\n",
"Для $Z_{ahij}=\\underset{bcdefg}{\\sum}\\lambda^{(1)}_{ab}\\Gamma^{(1)}_{cbd}\\lambda^{(2)}_{de}\\Gamma^{(2)}_{feg}\\lambda^{(3)}_{gh}U_{ijcf}$ с размерностью индексов $\\chi$ есть 6 индексов суммирования, т.е. $Z_{ahij}$ вычисляется за $\\chi ^ 6$, весь тензор за $\\chi ^ 6 \\cdot\\chi ^ 4$"
]
},
{
"cell_type": "markdown",
"id": "10dd2839",
"metadata": {},
"source": [
"__Оптимизированный способ__\n",
"\n",
"Делаются свёртки \n",
"\n",
"- $\\lambda^{(1)}_{ab}\\Gamma^{(1)}_{cbd} = A_{acd}$ за $\\chi$, т.е. $A$ за $\\chi^4$\n",
"\n",
"\n",
"- $\\lambda^{(2)}_{de}\\Gamma^{(2)}_{feg} = B_{dfg}$, за $\\chi$, т.е. $B$ за $\\chi^4$\n",
"\n",
"На этом моменте у нас есть два новых тензора $A, B$, которые мы вычислили за $2 \\chi^4$\n",
"\n",
"- $B_{dfg}\\lambda^{(3)}_{gh}=C_{dfh}$ за $\\chi$, т.е. $C$ за $\\chi^4$\n",
"\n",
"Добавляется ещё один тензор $C$, который мы вычислили за $\\chi^4$, так как тензоры $B, \\lambda^{(3)}$ были уже известны. На данный момент $3 \\chi^4$ операций\n",
"\n",
"\n",
"- $C_{dfh}A_{acd}=D_{acfh}$ за $\\chi$, т.е. $D$ за $\\chi^3$\n",
"\n",
"Новый тензор $D$, суммарно $3 \\chi^4 + \\chi^5$ операций\n",
"\n",
"\n",
"- $D_{acfh}U_{ijcf} = Z_{ahij}$ за $\\chi^{2}$, т.е. ещё $\\chi^{6}$ операций\n",
"\n",
"В итоге вычислили тензор $Z$ за $O(\\chi^{6})$ операций, наивный способ совершает $O(\\chi^{10})$ операций. Оптимизация сложности происходит за счёт дополнительного расхода памяти, упрощения выражения, поэтому для небольшого числа операций лучше использовать обычное суммирование."
]
},
{
"cell_type": "markdown",
"id": "2aafecb8",
"metadata": {},
"source": [
"Для $\\chi = 1$ получается (x0.02)\n",
"\n",
"\n",
"naive: 3.59 µs ± 220 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n",
"\n",
"optimised: 225 µs ± 3.51 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)"
]
},
{
"cell_type": "markdown",
"id": "92128c85",
"metadata": {},
"source": [
"Для $\\chi = 4$ получается (x4000)\n",
"\n",
"\n",
"naive: 1.59 s ± 25.5 ms per loop (mean ± std. dev. of 2 runs, 2 loops each)\n",
"\n",
"optimised: 401 µs ± 17.5 µs per loop (mean ± std. dev. of 2 runs, 100 loops each)"
]
},
{
"cell_type": "markdown",
"id": "db7a9dcc",
"metadata": {},
"source": [
"Для $\\chi=50$: \n",
"\n",
"optimised: 438 ms ± 17 ms per loop (mean ± std. dev. of 2 runs, 10 loops each)\n",
"\n",
"Для $\\chi=5-50$ naive заexplorить, к сожалению, не получается "
]
},
{
"cell_type": "code",
"execution_count": 326,
"id": "d332b860",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"N, O = [], []\n",
"C = np.arange(3, 51)\n",
"\n",
"for c in C:\n",
" np.random.seed(42)\n",
" lambda1 = np.random.normal(size=(c, c))\n",
" lambda2 = np.random.normal(size=(c, c))\n",
" lambda3 = np.random.normal(size=(c, c))\n",
" G1 = np.random.normal(size=(c, c, c))\n",
" G2 = np.random.normal(size=(c, c, c))\n",
" U = np.random.normal(size=(c, c, c, c))\n",
" \n",
" res = np.einsum_path(\"ab,cbd,de,feg,gh,ijcf->ahij\", lambda1, G1, lambda2, G2, lambda3, U, optimize=True)\n",
" n, o = res[1].split('\\n')[3:5]\n",
" n = np.float64(n.split(' ')[-1])\n",
" o = np.float64(o.split(' ')[-1])\n",
" N.append(n)\n",
" O.append(o)\n",
"\n",
" \n",
"plt.rcParams.update({'font.size': 14})\n",
"plt.figure(figsize=(8,4))\n",
"\n",
"plt.subplot(121)\n",
"plt.plot(C, N, color=\"blue\")\n",
"plt.title(\"Naive\")\n",
"plt.xlabel(\"$\\chi$\")\n",
"plt.ylabel(\"FLOPs\")\n",
"\n",
"plt.subplot(122)\n",
"plt.plot(C, O, color=\"red\")\n",
"plt.title(\"Optimised\")\n",
"plt.xlabel(\"$\\chi$\")\n",
"plt.ylabel(\"FLOPs\")\n",
"\n",
"plt.tight_layout()\n",
"\n",
"plt.figure(figsize=(8,4))\n",
"plt.plot(C, N, color=\"blue\", label=\"Naive\")\n",
"plt.plot(C, O, color=\"red\", label=\"Optimised\")\n",
"plt.xlabel(\"$\\chi$\")\n",
"plt.ylabel(\"FLOPs\")\n",
"\n",
"plt.legend()\n",
"\n",
"plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": 179,
"id": "688ca9b4",
"metadata": {},
"outputs": [],
"source": [
"c=2\n",
"np.random.seed(42)\n",
"lambda1 = np.random.normal(size=(c, c))\n",
"lambda2 = np.random.normal(size=(c, c))\n",
"lambda3 = np.random.normal(size=(c, c))\n",
"G1 = np.random.normal(size=(c, c, c))\n",
"G2 = np.random.normal(size=(c, c, c))\n",
"U = np.random.normal(size=(c, c, c, c))"
]
},
{
"cell_type": "code",
"execution_count": 180,
"id": "6eeac349",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[[ 0.24196227, -1.91328024],\n",
" [-1.72491783, -0.56228753]],\n",
"\n",
" [[-1.01283112, 0.31424733],\n",
" [-0.90802408, -1.4123037 ]]])"
]
},
"execution_count": 180,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lambda1\n",
"G1"
]
},
{
"cell_type": "code",
"execution_count": 319,
"id": "9e977aa4",
"metadata": {},
"outputs": [],
"source": [
"def mY_Z(lambda1, lambda2, lambda3, G1, G2, U):\n",
" c=2\n",
" A = np.tensordot(lambda1,G1, axes=([1], [1]))\n",
" B = np.tensordot(lambda2, G2, axes=([1],[1]))\n",
" C = np.tensordot(B, lambda3, axes=([2], [0]))\n",
" D = np.tensordot(A, C, axes=([2], [0]))\n",
" Z = np.tensordot(D, U, axes=([1, 2], [2,3]))\n",
" \n",
" return Z"
]
},
{
"cell_type": "code",
"execution_count": 365,
"id": "324465ef",
"metadata": {},
"outputs": [],
"source": [
"assert np.allclose(mY_Z(lambda1, lambda2, lambda3, G1, G2, U), Z(lambda1, lambda2, lambda3, G1, G2, U))"
]
},
{
"cell_type": "code",
"execution_count": 366,
"id": "207b4224",
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"O, my, Oerr, myerr = [], [], [], []\n",
"C = np.arange(3, 50)\n",
"\n",
"for c in C:\n",
" np.random.seed(42)\n",
" lambda1 = np.random.normal(size=(c, c))\n",
" lambda2 = np.random.normal(size=(c, c))\n",
" lambda3 = np.random.normal(size=(c, c))\n",
" G1 = np.random.normal(size=(c, c, c))\n",
" G2 = np.random.normal(size=(c, c, c))\n",
" U = np.random.normal(size=(c, c, c, c))\n",
" \n",
"\n",
" time1 = %timeit -o -q -n 2 -r 2 mY_Z(lambda1, lambda2, lambda3, G1, G2, U)\n",
" time2 = %timeit -o -q -n 2 -r 2 Z(lambda1, lambda2, lambda3, G1, G2, U)\n",
" \n",
" my.append(time1.average)\n",
" myerr.append(3*time1.stdev)\n",
" O.append(3*time2.average)\n",
" Oerr.append(time2.stdev)"
]
},
{
"cell_type": "code",
"execution_count": 367,
"id": "f7cb2b04",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAEQCAYAAACutU7EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA3wElEQVR4nO3dd5hU5dnH8e+9DXbpUpYmgkAEK5qNXVxFJGLFEo0VxYLY0KiYaDQaX31jwd4VBdEEg8bYG0pQUXgXUQQioosoHaQKS9nd5/3jmWGHYXbZgdk5M7O/z3Wd68ypc88cYG6eas45RERERNJJVtABiIiIiMRLCYyIiIikHSUwIiIiknaUwIiIiEjaUQIjIiIiaUcJjIiIiKSdnKADCFKrVq1c586dgw5DREREYpgyZcoy51zrWMfqdQLTuXNnSkpKgg5DREREYjCzudUdUxWSiIiIpB0lMCIiIpJ2lMCIiIhI2klqAmNmvc3sNTObb2bOzAZu4/zOofOil99GnXe4mU0xs/VmVmpmg+v0g4iIiEigkl0C0xiYDlwFlMVx3W+BdhHLh+EDZtYFeAuYCOwL3Ak8ZGanJChmERERSTFJ7YXknHsLn2xgZs/FcenPzrlF1RwbDCxwzl0R2v6vmR0AXAu8vL2xAqxevZolS5awadOmHbmNpKjc3FzatGlD06ZNgw5FRETilC7dqF8xs4bAbOA+59zYiGMHAe9Fnf8ucJ6Z5Trntiv7WL16NYsXL6ZDhw7k5+djZtsXuaQk5xxlZWXMnz8fQEmMiEiaSfVGvL/gS1J+B/QHxgFjzOzsiHPaAoujrluMT85aRd/QzC42sxIzK1m6dGm1b7xkyRI6dOhAQUGBkpcMZGYUFBTQoUMHlixZEnQ4IiISp5QugXHOLQPujdhVYmatgOuB0dt5zyeBJwGKiopcdedt2rSJ/Pz87XkLSSP5+fmqIhQR2RHFxX49fnxS3zbVS2BimQR0j9heBBRGnVMIlAPLduSNVPKS+fSMRUR2kKu2LKBOpWMC0wtYGLH9GdA36py+QMn2tn9JtOLiqgRVREQkY2zYAJ98AvPmJf2tk1qFZGaNgW6hzSygk5n1ApY75340szuB/Z1zfULnnwdsAqYClcDxwGXAsIjbPg5cbmb3A08AhwADgd/X9ecRERGp1+bOhcpKyEl+i5Rkl8AU4ZORqUA+cGvo9W2h4+2ArlHX3ASUAP8HnAFc4Jy7L3zQOTcH38C3N/AlcCNwpXNuh7pQp6uBAwdiZgwaNGirY8OGDcPMOO644wKITEREMk5pqV8H0GY02ePAjAeqbXTgnBsYtT0SGFmL+/4H2G8Hw8sYO++8My+99BIPPvggjRo1AqC8vJxRo0bRqVOngKMTEZGMEU5gGjZM+lunYxsY2Ya9996b7t2789JLL23e9+abb9KwYUOKQ41xJkyYQG5uLosWbTk+4I033sjee++dzHBFRCRdlZb65OXTT5P+1kpgMtSgQYMYMWLE5u0RI0Zw/vnnb+5107t3b7p27cqoUaM2n1NZWcmoUaNiVj+JiIhspbQUunSBrOSnEyk9DkyqGToUvvwy/uvC12xPT6ReveD+++O/7swzz+Taa69l9uzZNGnShHfeeYeHHnqIm2++efM5F154Ic888wzXX389AO+++y5Llizh7LPPru62IiIiVUpLYdddA3lrlcBkqBYtWjBgwABGjBjByJEjKS4u3qr9y3nnnUdpaSkTJ04EfCnNSSedRMuWLYMIWURE0olzgSYwKoGJw/aUhEBggxRywQUXcN5559G4cWNuu+22rY63bt2aE044gREjRrDbbrvx2muv8frrryc3SBERSU8//wxr1iiBkcTr06cPeXl5LFu2jJNOOinmORdddBGnnnoqu+66K23btuWoo45KbpAiIpKewj2QlMBIopkZ06ZNwzlHgwYNYp7Tt29fWrZsya233soNN9xAVgANsUREJA0FnMDo1yrDNWnShKZNm1Z73Mw4//zz2bRpE+eff34SIxMRkbQWTmC6dAnk7VUCk2Gee+65uI8vXLiQPn360Llz5zqJSUREMlBpKRQWQmjA1GRTAlOPrVq1ipkzZzJq1KgtBr0TERHZpgB7IIESmKRIdu+j2jrxxBOZPHkygwYN4thjjw06HBERSSelpXDooYG9vRKYemx8qmZWIiKS2jZuhJ9+CrQERo14RUREJD4//giVlUpgREREJI0E3IUalMCIiIhIvJTAiIiISNopLYUGDaB9+8BCUAIjIiIi8Skt9QPYBTh6uxKYZCgurprRUUREJN0FPAYMKIGR7TB+/HjMjGXLlu3QfQYOHMhxxx2XoKhiO+644xg4cGCdvoeISL3iHHz/vRIYqRvz58/n4osvpmPHjuTl5dGhQwcuuugi5s2bF9d9OnfuzD333LPFvoMPPpiFCxfSsmXLHYrxgQceYPTo0Tt0DxERSbIVK2D1aiUwknhz5syhqKiI6dOnM3LkSL777jtGjx7NjBkz+M1vfsMPP/ywQ/fPy8ujbdu2mNkO3adZs2Y0b958h+4hIiJJlgI9kEAJTEa67LLLyMrK4oMPPqBPnz506tSJI444gg8++ICsrCwuu+wyAIqLixk8eDBXXXUVLVq0oEWLFlx33XVUVlZuPj537lyuu+46zGxzwhJdhfTcc8/RuHFj3n77bXr06EFBQQEnnHACq1atYuzYsXTv3p1mzZpxzjnnUFZWtjnO6CqkCRMmcOCBB9K4cWOaNWvG/vvvz/Tp0zcfnzhxIocffjgFBQV06NCBSy+9lNWrV28+vm7dOgYOHEjjxo0pLCzkjjvuqLsvWUSkvqqPCYyZ9Taz18xsvpk5Mxu4jfOLzezfZrbQzNaZ2TQzuyDGOS7G0qNOP0yKWr58Oe+88w6XXXYZBQUFWxwrKChgyJAhvP3226xYsQKAF154gcrKSj777DOeeOIJnnzySe6//34AXnnlFTp27MjNN9/MwoULWbhwYbXvu2HDBu69915eeOEFxo0bR0lJCaeccgojR47k5Zdf5tVXX+WNN97g0UcfjXl9eXk5J554IoceeihfffUVkyZNYujQoWRnZwPw9ddfc/TRR3PCCSfw1Vdf8corr/Dll19ywQVVfxyuvfZa3n//fV5++WXGjRvH1KlTmTBhwo58nSIiEi2cwHTpEmgYyZ4LqTEwHRgVWrblYOBr4C5gIdAPeNLM1jvnXow6dw9gecT20h0PN8rQofDll/FfF75me3oi9eoFoYSiNmbPno1zjp49e8Y8vvvuu+OcY/bs2QC0a9eOBx98EDOjR48efPvttwwfPpxrrrmGnXbaiezsbJo0aULbtm1rfN/y8nIeeeQRdtttNwDOPPNM7rvvPhYvXkyrVq0AP3nkRx99xB/+8Ietrl+9ejUrV67k+OOPp2vXrgD06FGVg959992cfvrpW1z72GOPse+++7JkyRIKCgp45plnGDFiBP369QPg2WefpWPHjrX96kREpDZKS6FNG2jcONAwkprAOOfeAt4CMLPnanF+dB3AY2Z2BHAKEJ3ALHHO7Vi3mHrowAMP3KIty0EHHcSf//xnVq9eTdOmTWt9nwYNGmxOXgAKCwtp27bt5uQlvG/mzJkxr99pp50YOHAg/fr1o0+fPvTp04dTTz2VTp06ATBlyhS+++47xowZs/ka5xwA33//PQUFBWzcuJGDDjpo8/HGjRuz11571foziIhILaRADyRIz9momwKxutKUmFkDYCZwu3Puo4S/cxwlIVsIl7wkYfbnbt26YWbMnDmTAQMGbHV85syZmBndunVL6Pvm5Gz5R8nMyM3N3WpfuH1NLM8++yxDhw7lnXfe4bXXXuPGG2/k1VdfpV+/flRWVnLhhRdy9dVXb3Vdhw4d+PbbbxPzQUREpGalpXDwwUFHkV6NeM3sOKAP8GTE7oXApfhSmZOBWcA4MzusmntcbGYlZlaydGnia5mC1rJlS/r168ejjz7KunXrtji2bt06HnnkEY455hh22mknACZNmrS5JAPg888/p3379ptLX/Ly8qioqEha/Pvssw/Dhg1j/PjxFBcXM3LkSAD2228/ZsyYQbdu3bZa8vPz6dq1K7m5uXz++eeb77V27dotGgGLiMgO2rTJz0SdAiUwaZPAmNkh+GqjK51zk8P7nXOznHOPO+emOOc+c84NAd4Brot1H+fck865IudcUevWrZMTfJI9/PDDlJeXc9RRR/Hhhx/y008/MX78ePr27YtzjocffnjzuQsWLGDo0KHMmjWLsWPHcvfdd29RytG5c2c+/vhj5s+fv8MD19Vkzpw53HDDDUycOJG5c+fy0UcfMW3aNHbffXcAhg0bxuTJkxk8eDBTp07lu+++44033uCSSy4BfHXRoEGDGDZsGO+//z4zZszgggsuSGryJSKS8X78ESorUyKBSYsqJDM7FN925mbn3GO1uGQScEbdRpW6unbtSklJCbfddhvnnHMOS5YsoXXr1vTv358xY8Zs0bD1rLPOoqKiggMOOAAzY9CgQVskMLfddhuXXHIJXbt2ZcOGDVuU1iRSQUEB3377LaeddhrLli2jsLCQs846i2HDhgGw9957M2HCBG666SYOP/xwKioq2HXXXbeoJrvnnntYu3YtAwYMoKCggCuuuIK1a9fWSbwiIvVSinShBrC6+kHa5hub/QJc7px7bhvn9QbeBG5xzg2v5b3/BTRzzh1Z03lFRUWupKQk5rH//ve/1fbkiVsS28DEo7i4mD333HOLEpn6KKHPWkQkkz3xBAwe7Etidt65zt/OzKY454pi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\n",
"text/plain": [
"<Figure size 576x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.rcParams.update({'font.size': 14})\n",
"plt.figure(figsize=(8,4))\n",
"\n",
"plt.subplot(121)\n",
"plt.plot(C, my, color=\"blue\")\n",
"plt.title(\"My\")\n",
"plt.xlabel(\"$\\chi$\")\n",
"plt.ylabel(\"time,sec\")\n",
"\n",
"plt.subplot(122)\n",
"plt.plot(C, O, color=\"red\")\n",
"plt.title(\"Optimised\")\n",
"plt.xlabel(\"$\\chi$\")\n",
"plt.ylabel(\"time,sec\")\n",
"\n",
"plt.tight_layout()\n",
"\n",
"plt.figure(figsize=(8,4))\n",
"plt.errorbar(C, my, myerr, color=\"blue\", label=\"My\")\n",
"plt.errorbar(C, O, Oerr, color=\"red\", label=\"Optimised\")\n",
"plt.xlabel(\"$\\chi$\")\n",
"plt.ylabel(\"time,sec\")\n",
"\n",
"plt.legend()\n",
"\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"id": "1b180a50",
"metadata": {},
"source": [
"### Задача 7"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "1a00a71e",
"metadata": {},
"outputs": [],
"source": [
"N = 1000\n",
"K = 3\n",
"d = 3\n",
"L = 10\n",
"\n",
"np.random.seed(42)\n",
"mu_true = np.random.uniform(-L, L, size = (K, d))\n",
"data = np.random.normal(mu_true, size = (N, K, d))\n",
"data = np.vstack(data)\n",
"np.random.shuffle(data)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "381a2bc2",
"metadata": {},
"outputs": [],
"source": [
"def scatter_plot(data, col=None):\n",
" from mpl_toolkits.mplot3d import Axes3D \n",
" %matplotlib inline\n",
" fig = plt.figure()\n",
" ax = fig.add_subplot(111, projection='3d')\n",
" ax.scatter(data[:,0], data[:,1], data[:,2], s = 0.5, color=col)\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "1cc70b18",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"if d == 3:\n",
" scatter_plot(data, None)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "e32355c0",
"metadata": {},
"outputs": [],
"source": [
"def naive_dist_i(x, mu):\n",
" # x: N datapoints, mu: N cluster centers\n",
" # returns: D_{i}, squared distances from x[i] to mu[i]\n",
" dist = np.zeros(x.shape[0])\n",
" for i in range(x.shape[0]):\n",
" dist[i] = np.sum((x[i] - mu[i])**2)\n",
" return dist\n",
"\n",
"def naive_dist_ij(x, mu):\n",
" # x: N datapoints, mu: K cluster centers\n",
" # returns: D_{ij}, squared distances from x[i] to mu[j]\n",
" dist = np.zeros((x.shape[0], mu.shape[0]))\n",
" for i in range(x.shape[0]):\n",
" for j in range(mu.shape[0]):\n",
" dist[i, j] += np.sum((x[i] - mu[j])**2)\n",
" return dist\n",
"\n",
"def naive_kmeans():\n",
" ss_list=[]\n",
" mu = data[np.random.choice(range(data.shape[0]), K, replace=False)]\n",
" c = np.random.randint(low=0, high=K-1, size=data.shape[0])\n",
" for n in range(10):\n",
" c = np.argmin(naive_dist_ij(data, mu), axis = 1) \n",
" ss = np.mean(naive_dist_i(data, mu[c]))\n",
" ss_list.append(ss) \n",
" for i in range(K):\n",
" cluster_members = data[c == i]\n",
" cluster_members = cluster_members.mean(axis = 0)\n",
" mu[i] = cluster_members\n",
" return ss_list, c"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "6b0e811d",
"metadata": {},
"outputs": [],
"source": [
"def dist_i(x, mu):\n",
" # x: N datapoints, mu: N cluster centers\n",
" # returns: D_{i}, squared distances from x[i] to mu[i]\n",
" return np.sum((x - mu)**2)\n",
"\n",
"def dist_ij(x, mu):\n",
" # x: N datapoints, mu: K cluster centers\n",
" # returns: D_{ij}, squared distances from x[i] to mu[j]\n",
" n, k = x.shape\n",
" x_mod = np.transpose(x[None,...].repeat(k, axis=0), axes=(1, 0, 2))\n",
" mu_mod = mu[None, ...]\n",
" return np.sum((x_mod-mu_mod)*(x_mod-mu_mod), axis=2)\n",
" \n",
"def kmeans():\n",
" ss_list=[]\n",
" mu = data[np.random.choice(range(data.shape[0]), K, replace=False)]\n",
" c = np.random.randint(low=0, high=K-1, size=data.shape[0])\n",
" \n",
" for _ in range(10):\n",
" c = np.argmin(dist_ij(data, mu), axis = 1) \n",
" ss = np.mean(dist_i(data, mu[c]))\n",
" ss_list.append(ss) \n",
" for i in range(K):\n",
" mu[i] = data[c==i].mean(axis=0)\n",
" return ss_list, c"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "84416419",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"885 ms ± 51.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/h9/ll8t8frd1r575llt96l1glhm0000gn/T/ipykernel_21445/3230926319.py:24: RuntimeWarning: Mean of empty slice.\n",
" mu[i] = data[c==i].mean(axis=0)\n",
"/Users/goloshch/.conda/envs/NPM/lib/python3.10/site-packages/numpy/core/_methods.py:181: RuntimeWarning: invalid value encountered in true_divide\n",
" ret = um.true_divide(\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.57 ms ± 419 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
}
],
"source": [
"%timeit naive_kmeans()\n",
"%timeit kmeans()"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "84fb1f46",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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v/7X/+L73/++PfNtvuDxeDBNk9zcXDweDzfeeCP/9E//xBvf+MZkniZN7FTCmpe1b98+fvKTn+B0OqmtrcXv9/Nv//ZvCVndVJW2WgITPp9vQfLocH4qqFU4YpHcEqs0TZOjR4+Sl5cXM6nPnj3LnXfeyXe+8x127NiRoncwM86cOcMdd9wBBLMvd911Fx//+MeTfZo0secLpmnysY99jGeffZbCwkJ0XedNb3oTe/fupaamJqGcdaTS1tLS0pgbRixvQ0oZc3dcqmAV+/T29jI+Pk5+fj4ej4eioqKYI9idnZ287W1v45vf/CZXXXVVila8KJAm9nzB7/fz1a9+lQ9+8IOoqkpXVxf79+/nySefxOPxcNtttyXcUw7xl7ZKKe3xvwtVHDMXLDF/a3yTNSZ3xgh7CLq6unjrW9/KV7/61WQHqhYj0sReDOjt7eXJJ59k//79dk/5nj17WL16dUIEi1TaWlpaesFQeMu1zcnJoa6ublGS2lpjbm4udXV1dg17b28vAwMD01KE4dmDnp4e3vKWt/ClL32J66+/foHewbwiTezFhoGBAbunvKury+4pT3S/O1Npq9vt5ujRoxQUFMS8X50vWMKN1oMnHOERdk3TKCkpISsrCyklb37zm/nsZz/LzTffvACrXxCkib2YMTw8bPeUt7S02D3lmzdvTojkVmlrd3c3PT09thWMNJNqoWGlEmcidSRMTk7S29vL+9//fk6fPs0b3/hG/uEf/oEVK1akeLWLBmliXywYGxuze8pPnjzJ9ddfz549e9i5c2dcZLSE8isqKsjKyqKnp2dG1daFgpSSY8eOkZWVxbJly2I6dmRkhLe85S28//3vxzAMfvnLX/KDH/wg6Q+u5557jgceeADDMHjve99rz/BaYKSJfTFicnKS5557jieeeIIjR45w7bXXsmfPHq666qqoyGgNdK+trZ02pypUtXVgYIDs7OwFK21NhNRjY2O89a1v5f777+ftb397ilYY3N6sWrWK559/nurqanbu3Ml///d/s27dupSdM0okndiLwo97/PHHbZ2z8Ja4z3/+86xYsYLVq1fz85//fIFWmBgyMzO54447+OEPf8jBgwe55ZZb+OEPf8iVV17JAw88wIsvvkggEIh4rM/n489//jNLly69YPicEIK8vDxWrVrFlVdeSV1dHePj4xw4cIDDhw9z7ty5GV83mbBInZmZGTOpPR4Pd955J/fdd19KSQ3wyiuvsGLFCpYtW4bT6eTOO+/kqaeeSuk5FwoL37EAbNiwgf3793PfffdN+3ljYyOPPvoox44d49y5c9xwww00NTUtuMuZCFwuF7t372b37t34/X67p/zv//7v2bVrF3v37uXaa6/F6XQyOjpKY2NjdHOzhSA3N5fc3FxWrFhhl7YeOnQopaWtVtotMzOT5cuXx3Ts5OQkd955J/fccw/vete7krquSOjs7JzWSVZdXc3LL7+c8vMuBBYFsWcq6H/qqae48847cblc1NXVsWLFCl555ZVLpljB6XRy8803c/PNN6PrOr/97W954okn+PjHP86qVatoaGjgySefnJPUkZCdnc2yZctYtmwZk5OT9PT0cOTIEYQQNskTLW21SO1yuWK21F6vl7vuuou3v/3tvPvd705oHWlciEVB7JnQ2dnJlVdeaX9fXV1NZ2fnAq4oddA0jeuvv57rr7+eo0ePcscdd3DllVfyzne+k3Xr1tk95fGI32dmZrJ06VKWLl1ql7YeO3YsodLWUFLHWqTj8/m455572L17N+9///vnLQ9fVVVFe3u7/X1HR8e06SyXEuaN2DfccAPd3d0X/Pyzn/0se/bsma9lXBQ4e/YsTz31FOvWrcM0TV599VUef/xxHnroIVasWMGePXu4+eab4+opz8jIoLa21q6B7+3t5fjx4zGVtkopOX78eFykDgQC/OVf/iWvf/3r+Zu/+Zt5La7ZuXMnp06doqWlhaqqKh599FF+9KMfzdv55xPzRuwXXngh5mMupydsKG677Tb7a0VRuOKKK7jiiiswTZPDhw/z+OOP88gjj1BTU8Ptt9/OrbfeGte0EafTSXV1NdXV1QQCAXuuuFXaGtrIYcEitcPhiJnUuq5z7733csUVV/B3f/d3814xp2ka//qv/8rNN9+MYRi85z3vYf369fO6hvnCokp3XXfddXzpS1+yu3iOHTvGXXfdxSuvvMK5c+d4wxvewKlTpy7q4FmyYBWCPP7447bs7p49e7jtttsS1tUOLW21GjisqrcTJ07gcDhinmpqGAb33Xcfq1at4pOf/OSiLINdQFyaeewnn3yS+++/n76+PvLz89myZYud2vrsZz/Ld7/7XTRN4ytf+Qq33HLLfCzpooKUkhMnTtg95W632+4pLykpSYhE1vidUIWYlStXUlhYGPXrGobB/fffT2VlJZ/97GfTpL4Qlyax00gepJScPn2affv28dRTT+F0Orn99tvZs2cP5eXlcZHKenBYo397e3svUG2dqULMNE0++MEP4na7+eIXv7joSmAXCdLETiN6SClpa2tj3759PPnkk0gp7Z7y6urqqEhu9XwLIVi1apV9jJSS4eHhWUtbTdPkIx/5CIqi8NWvfjVN6pmRJnaq8KlPfYpvf/vb9oiYz33uc9x6660LvKrkQUpJV1eXTfKJiQl7TvmyZcsiknwmUkf6u9HRUbslMxAIcPLkSZqbm/H7/XzjG99Ik3p2pImdKqRIpG7Roqenx+4pHxoa4tZbb2Xv3r02gaMldTisiagPPvggBw4c4Morr+R973sfb3rTm1L8ji5qXJq14mnMP8rKyvirv/orfvGLX/Dcc89RW1vLP/7jP/K6172Oz3zmM/zFX/wFx44di4nUFqxZ0F1dXTz88MNJnRE+Ez71qU9RVVXFli1b2LJlC88++2zKz7mYkbbYU/jUpz7F9773PdxuNzt27ODLX/7yxTZjOSkYGhrizjvvpLOzE1VVbeGITZs2zelOSyl55JFHqK+v50c/+tG8dphd5B5X2mInghtuuIENGzZc8O+pp57ir//6rzl9+rTd8/yhD31ooZe7IOju7mbDhg00NDTw+9//nu3bt/PII49w9dVX8/GPf5xXXnkF07xQQ1xKyde//nUOHjzID37wg0UxEeVyRtpiR0Brayu7d+/m6NGjC72URYOJiQn+53/+h3379tHQ0GD3lF955ZUoisK3v/1tXnjhBfbt24fL5Zr39V3kHlc6eJYqdHV1UVFRAcAjjzzCyy+/zKOPPrrAq1qc8Hq9PP/88zzxxBMcPHjQTnE9++yzKRmGYGG2foMrr7yS4uJihBB84hOfoKuri+9+97spW0uSkSZ2qnD33Xdz+PBhhBAsXbqUb33rWzbR05gZfr+fr3/969x9992pnEYZEy5CjytN7DTSiISL3ONKOrHTEY40Lgk8+OCDF3hclzPSFnuBsEjVMtNYGKRd8UsBi1gtM42FQTqPfSngclLLTGNhkCb2AiCSWualquWWxsIgTew00rgEkSb2AuBy1XJLY/6QJvYCIFQt0+/38+ijj3L77bcv9LIWFJf6NJj5RjqPvQC4nNQyo8XlNA1mPpAm9gLh1ltvvaQUWhLF5ToNJlVIu+JpLGqkMwjxIW2x05g3pKfBzB/mqjxL4xKFEKIVGAMMQJdS7ljYFQUhhHgR+LCU8sDU9x8DkFJ+fur7nwOfklL+ccEWeREg7Ypf3ni9lHLLYiH1DPgpcKcQwiWEqANWAq8s8JoWPdLETmNRQAhxhxCiA7gKeGbKMiOlPAY8BjQCzwH/W0ppLNxKLw6kXfHLFEKIFmCIYKPPt6SU/77AS0ojiUgHzy5fXCOl7BRClALPCyFOSCl/u9CLSiM5SLvilymklJ1T//cCTwK7FnZFaSQTaWJfhhBCZAshcq2vgZuAi0YgLI25kXbFL0+UAU9OTfjQgB9JKZ9b2CWlkUykg2dppHEJIu2Kp5HGJYg0sdNI4xJEmthppHEJIk3sNNK4BJEmdhppXIJIEzuNNC5BpImdRhqXIP5/oVda1dCtXLcAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ss_list, c = kmeans()\n",
"plt.plot(ss_list)\n",
"\n",
"colors = np.array([plt.cm.cool(i/(K-1)) for i in range(K)])\n",
"if d == 3:\n",
" scatter_plot(data, colors[c])"
]
},
{
"cell_type": "markdown",
"id": "717e0a58",
"metadata": {},
"source": [
"__Вывод:__\n",
"\n",
"- При N=1000 naive_kmeans работает за 874 ms ± 77.6 ms ms, kmeans за 7.7 ms ± 265 µs, т.е. быстрее примерно в 100 раз\n",
"\n",
"- naive_kmeans для N=10000 мой компухтер уже не вывозит"
]
},
{
"cell_type": "markdown",
"id": "3f82aca7",
"metadata": {},
"source": [
"### Задача 8"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "46c3a97e",
"metadata": {},
"outputs": [],
"source": [
"def HWseq1(n):\n",
" if n > 2:\n",
" a = np.zeros(n+1, dtype=int)\n",
" a[1] = a[2] = 1\n",
" for i in range(3, n+1):\n",
" a[i] = a[a[i-1]] + a[i-a[i-1]] \n",
" else:\n",
" a = np.array([0, 1, 1])[1:n+1]\n",
" \n",
" return a[1:]\n",
"\n",
"\n",
"def HWseq2(n):\n",
" if n > 2:\n",
" a = [0, 1, 1]\n",
" a[1] = a[2] = 1\n",
" for i in range(3, n+1):\n",
" a.append(a[a[i-1]] + a[i-a[i-1]])\n",
" else:\n",
" a = [0, 1, 1][1:n+1]\n",
" \n",
" return np.array(a[1:])\n",
"\n",
"\n",
"@jit(nopython=True)\n",
"def HWseq3(n):\n",
" if n > 2:\n",
" a = np.zeros(n+1, dtype=np.int32)\n",
" a[1] = a[2] = 1\n",
" for i in range(3, n+1):\n",
" a[i] = a[a[i-1]] + a[i-a[i-1]] \n",
" else:\n",
" a = np.array([0, 1, 1], dtype=np.int32)[1:n+1]\n",
" \n",
" return a[1:]"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "f89b5663",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"79 ms ± 2.52 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"32.8 ms ± 258 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"520 µs ± 10.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"n = 10**5\n",
"\n",
"%timeit HWseq1(n)\n",
"%timeit HWseq2(n)\n",
"%timeit HWseq3(n)"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "8465b982",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"686 ms ± 21.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"52736107\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"n=10**8\n",
"\n",
"x = np.arange(1, n+1)\n",
"%timeit y = HWseq3(n)\n",
"\n",
"plt.figure(figsize=(10,5))\n",
"plt.plot(x, y/x, color=\"red\")\n",
"plt.ylabel(\"a(n)/n\", fontsize=fontsize)\n",
"plt.xlabel(\"n\", fontsize=fontsize)\n",
"plt.title(\"Hofstadter-Conway sequence\", fontsize=fontsize)\n",
"\n",
"print(y[-1])"
]
},
{
"cell_type": "markdown",
"id": "af6b8830",
"metadata": {},
"source": [
"__Вывод:__\n",
"\n",
"- $a(10^8) = 52736107$\n",
"- $jit$-версия работает лучше всего"
]
}
],
"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.10.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}