Skip to content

Instantly share code, notes, and snippets.

@eric-czech
Created September 11, 2020 16:47
Show Gist options
  • Save eric-czech/77f68a5c9aeaca647de6d7bf995423b2 to your computer and use it in GitHub Desktop.
Save eric-czech/77f68a5c9aeaca647de6d7bf995423b2 to your computer and use it in GitHub Desktop.
Dask SVD compressed array shape benchmark
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dask SVD Compressed Benchmark\n",
"\n",
"Quick check to see how transposition of arrays affects SVD performance."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import tqdm\n",
"import pandas as pd\n",
"import numpy as np\n",
"import plotnine as pn\n",
"import dask.array as da\n",
"from dask.array.linalg import svd_compressed"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def run(x, k):\n",
" u, s, v = svd_compressed(x, k=k, n_power_iter=4, compute=True, seed=1)\n",
" return (u.mean() + v.mean()).compute()\n",
"\n",
"def benchmark():\n",
" df = []\n",
" # Create arrays with `n` elements, a fraction \n",
" # `s` of which become rows and the rest columns\n",
" for arg in tqdm.tqdm([\n",
" (n, s)\n",
" for n in [1000, 10000, 100000, 300000]\n",
" for s in [.1, .2, .4, .5, .6, .8, .9]\n",
" ]):\n",
" n, s = arg\n",
" m = int(n * s)\n",
" n = n - m\n",
" k = 10\n",
" x = da.random.random((m, n), chunks='auto')\n",
" r = %timeit -n 1 -r 1 -o -q run(x, k=k)\n",
" df.append(dict(m=m, n=n, k=k, s=s, time=r.average))\n",
" return pd.DataFrame(df)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 28/28 [18:06<00:00, 38.82s/it] "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4h 13min 21s, sys: 23min 44s, total: 4h 37min 5s\n",
"Wall time: 18min 6s\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"%%time\n",
"df = benchmark()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAswAAAHICAYAAABaqLyRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAA9hAAAPYQGoP6dpAACIV0lEQVR4nOzdeVxU5f4H8M+ZMyvDvsgiAoKKC+4r7ltWZppm1i0zNbtdu9Wt226mVtpqv26LdW3TrMybLV6z22LuZlaaG+WOuCKKosAAsz6/P4YZGAaOoMAM8Hm/Xrxkzjlz5jnjl5nPPPOc50hCCAEiIiIiIqqUytcNICIiIiLyZwzMREREREQKGJiJiIiIiBQwMBMRERERKWBgJiIiIiJSwMBMRERERKSAgZmIiIiISAEDMxERERGRAgZmIiIiIiIFDMxE1GRIkoTJkydfcrv169dDkiQsXry4zttUWwYPHoykpCRfN+OyTZ48GZIk+boZRESVYmAmv5Sbm4sZM2agU6dOCA4ORlBQEJKTkzF27Fi8//77AIDz589Dr9ejbdu2ivs6c+YMtFotunfvDgDIysqCJEnuH5VKheDgYCQnJ2PMmDF45513UFhYWOfHSERERA2D2tcNIKro+PHj6N27N86ePYubbroJ06ZNg1arRWZmJlavXo1//etfuPPOOxEeHo5x48bh008/xebNm9G/f/9K9/fhhx/CarVi2rRpHssHDx6MO++8EwBQVFSE48ePY82aNbj77rvx7LPPYtmyZejXr1+dHy8RERH5NwZm8jvz589HdnY2Xn/9ddx3331e60+cOOH+fdq0afj000/x/vvvVxmYP/jgAxgMBtx6660ey1NSUjBx4kSPZc8++yy+++47jB8/Htdddx127dqFxMTEWjiqhsvhcKCkpAQBAQG+bgo1QoWFhQgMDPR1M4iIFHFIBvmd/fv3AwCGDBlS6fr4+Hj370OGDEGrVq2wfPlyFBQUeG37008/Yd++fbjpppsQEhJSrce/5ppr8PLLL+PixYt4/vnnq93uxYsXo1+/fggODkZAQADatm2L+++/HxaLxb2Nw+HA66+/js6dO8NgMCA4OBhDhw7F6tWrvfaXlJSEwYMHY8+ePbj66qsRHByMiIgITJs2DSaTCUIIvPzyy2jVqhV0Oh3at2+Pr7/+2mMfruEnc+bMwX/+8x907doVer0ecXFx+Oc//wmTyeSx/Zw5cyBJEv788088+uijSExMhFarxWeffQYAEELg3XffRa9evWA0GmE0GtG3b1+sWLHCq/3fffcdhg4dimbNmkGn0yE2NhbXXHMNfvrpJ/c2eXl5eOSRR9C6dWsYDAaEhISgffv2+Oc//+m1v3Xr1uHaa69FWFgYdDod2rVrhxdffBF2u91r29WrV6NPnz4wGAyIiorC1KlTkZubq/wfWIUFCxagbdu20Ol0aNmyJZ555hnYbDav7XJycnDfffchKSkJWq0W0dHRmDhxIrKysjy2W7x4MSRJwtq1azF//ny0bt0aOp0OycnJePXVVyttw+7du/GXv/wFcXFx0Gq1aN68OcaMGYPt27d7bXvq1CnceuutCA8Ph8FgwKBBg7y2Kz9Ge+HChWjfvj30ej3atGmDJUuWAABOnjyJW265BRERETAajRgzZgyys7O9Huvhhx9Gt27dEB4eDp1OhzZt2uDJJ59EcXGx4mN26tQJer0e9957b5XPvcViwe233w6VSoX58+e7l3/yySdIT09HeHg49Ho94uPjMXbsWOzbt6/KfRERXQn2MJPfSU5OBgAsWrQIL774ItTqqstUkiRMnToVM2bMwLJly3DXXXd5rHeNd644HONSJk+ejAceeABff/01/v3vf19y+zvuuANLlixBt27d8OijjyIqKgqHDx/Gl19+iWeeeQZarda9348++gj9+/fH888/j4KCArz33nu4+uqrsWTJEq8e75MnT2LYsGEYP348xo4di61bt+L9999HcXExwsLCsHnzZtx9992QZRmvvfYabrzxRhw4cMDr5K+vv/4a//d//4d77rkH06ZNw48//ohXX30Vu3btwurVq6FSeX52vu2226BWq/H3v/8dgYGBSE1NBQBMmTIFS5YswZgxY3DbbbcBAL788kuMHTsWb7/9Nv72t78BADZu3IhRo0ahffv2eOSRRxAREYHTp09j8+bN2LVrl3uoy4QJE7B+/Xrcdddd6Nq1K8xmMw4dOoS1a9d6tOeDDz7AtGnT0LVrVzz++OMIDQ3FTz/9hCeeeAI7duzAsmXL3Nt+8803GDNmDKKiovDYY48hLCwMX331Fa655ppL/j9W9MYbb+DkyZP429/+hvDwcHz11VeYPXs2MjMzPU4IPH78OPr27YvCwkLceeedaNOmDU6ePIm3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Ngw//vgjAGDWrFleJ0WVd/jwYfcJe8XFxe4r/W3ZsgXx8fFYtmxZtS5aMn78eNx222345JNP0KtXL/cwkCNHjmD58uX47bffEBoaiqFDh+L222/HRx99hCFDhmDs2LEoLCzEe++9hzNnzmDJkiV1dgGHrl27Yvjw4bjnnnuQkJCA1atXY8WKFRg0aJDXBV2qMm7cONx111149913sXv3btxwww2Ijo7GqVOnsG3bNnz77bfuE/z++te/4tixY7j66quRmJgIm82GlStXYv/+/e6T0g4cOICBAwfihhtuQFpaGiIjI3H48GH8+9//RkhICMaOHQsAaN68ORYuXIipU6ciNTUVd9xxB5KTk3H+/Hns3bsXX331FVasWIHBgwdDlmW8/vrrGDt2LHr37o27774bYWFh+PLLLy/rcudt27ZF7969MX36dPe0cuvWrcPEiRM9vvp/++230b9/f1x11VW47bbb0KNHD6hUKhw9ehTffPMNevbs6TENXXUFBARg0aJFGDduHDp37oxp06YhNTUVeXl52LBhA6699tpKL+5TX2666Sa8/fbbGD9+PEaMGIHz58/j448/rpWL3Dz77LMICAjAjBkzUFxcjI8//hhqtRpXX301goKCMGjQICQkJKCwsBDLli1DQUEBpkyZUgtHRURUCV9Nz0FUla1bt4pHHnlE9OrVS0RHRwu1Wi2CgoJE9+7dxTPPPOOeuqwy//nPf9zTqJWfDqw811Rrrh9JkoTRaBRJSUli9OjRYuHChZecSq4ih8MhFi5cKHr27CkCAgJEQECAaNu2rXjggQc8pn6z2+3iX//6l+jYsaPQ6XQiMDBQDBkyRHz//fde+0xMTBSDBg3yWu6almzdunWXvI/rWGfPni2WLVsmOnfuLHQ6nYiJiRH/+Mc/vI7TNa1cZVOYuXz66adi8ODBIiQkRGi1WtGiRQtx7bXXirffftu9zRdffCHGjBkj4uPjhU6nE2FhYaJXr17inXfecU+FlpubKx588EHRtWtXERYWJnQ6nUhKShJTpkwR+/fv93rcrVu3ivHjx4vo6Gih0WhEdHS0SE9PF88++6w4d+6cx7bfffed6NWrl9DpdCIyMlJMnjxZnD17tsbTyi1atEi88cYbIjU1VWi1WpGQkCDmzJlT6ZRm58+fF48//rho27at0Ol0IigoSLRt21bcddddYuvW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MxNjx44FAEycOBHffvst1q5di+LiYsyaNQvp6elISUkBAEyePBmvvvoqjh49itzcXMydOxdTp0715aE2SJdV1QcOHMDUqVPRunVrREREoHXr1rjzzjtx4MCB2m4fERERUaM3d+5cGAwGzJs3D8uXL4fBYMBdd90FjUaDlStX4vPPP0doaCjmzZuHFStWIDw8HADQrl07vP/++5g2bRoiIiKwf/9+LF261L3fadOmYcKECejevTtSUlLQpUsXzJw501eH2WDVeFq57du3Y/DgwdDpdLj++usRExOD06dPY9WqVSgpKcGGDRvQrVu3umpvrcjPz/e7EwfUajVsNpuvm+FXJEmCVquFxWLh2euVYM14Y80oY814Y80o87eaqc/3bl9NK0f+qcaBediwYTCbzfj+++9hNBrdy00mE66++mro9Xr8+OOPtd7Q2lRf8zDXBM9e98b5UZWxZryxZpSxZryxZpT5W800hXmYyT/VeEjG1q1b8dhjj3mEZcA5h+Wjjz6KrVu31lrjiIiIiIh8rcaB2TVfZWVMJhOvTU5EREREjUqNA/Pw4cMxY8YM7Nu3z2P5vn378NRTT2HEiBG11jgiIiIiIl+rcWD+v//7PwghkJaWhs6dO+Pqq69Gly5dkJaWBofDgVdeeaUu2klERERE5BM1PukPcF5m8YMPPsDmzZuRl5eH8PBw9O/fH1OmTEFgYGBdtLNWcZaMhoFnrytjzXhjzShjzXhjzSjzt5rxt/duajouKzA3dJwlo2Hg2evKWDPeWDPKWDPeWDPK/K1m6nOWDKLyajwkY9euXfjf//5X6br//e9/2L179xU3ioiIiIjIX6hreocHH3wQ/fr1w8iRI73W/frrr3j11VexevXqWmkcERERkS9wHmYqr8Y9zDt37kS/fv0qXZeeno7ff//9ihtFREREROQvahyYzWYzLBZLletKSkquuFFERERERP6ixoG5a9euWLJkSaXrlixZgs6dO19xo4iIiIiI/EWNxzA/8cQTGD16NK677jpMmTIFcXFxOHXqFBYtWoTvv/8e//3vf+uinbVKq9X63dQ0arWa45oqkCQJgPOy601wMpdLYs14Y80oY814Y80oY80QOdU4MF933XVYunQpHnnkEUyYMAGSJEEIgfj4eCxduhTXXXddXbSzVlksliqHlfiKv03d4w9kWXZfip3TPXljzXhjzShjzXhjzSjzt5rxt84uajpqPCQDAG6++WYcO3YMe/fuxaZNm7B3714cO3YMEyZMqO32ERERETV6b775Jnr06AGdTodbbrnFY11GRgb69OmDgIAApKWlYdOmTR7rP//8cyQnJ8NoNGLEiBE4efKkx/qZM2ciMjISoaGhmD59OqxWq3vdhQsXMGHCBAQFBaF58+Z466236u4gG7DLCswuqamp6Nu3L1JTU2urPURERERNTlxcHGbOnIm77rrLY7nVasXo0aMxduxY5OXl4fHHH8eYMWOQl5cHANi3bx+mTJmCd955B7m5uWjdujVuvfVW9/3fe+89LFu2DNu2bcPBgwfx+++/Y+7cue719957L2w2G06dOoVVq1bhqaeewrp16+rnoBuQywrMf/zxB2655RakpKRAp9O5p5J78skn8e2339ZqA4mIiIgau3HjxuGGG27wuprh+vXrUVRUhEceeQQ6nQ4TJ05Ey5Yt8eWXXwIAPvroI1x77bUYPnw4DAYDnn32WWzZsgWHDx8GACxatAj//Oc/kZSUhKioKMycORMffPABAMBkMmH58uWYO3cugoKC0LVrV0yePNm9nsrUODCvXr0aXbt2RVZWFm655RaPbn2NRsOufCIiIqJakpGRgY4dO0KlKotsXbp0QUZGhnt9+RnKwsPDkZCQUOX6Ll264MSJE7h48SIOHDgAIQTat29f6b6pzGXNknHLLbdgyZIlsNlseP75593runbtivfee69WG0hERERU3xbl3HXpjS7D/UHLarR9YWEhQkJCPJaFhobi4sWLiutdJ2tWXB8aGgrAeSXDwsJCBAcHV3lfKlPjHuaMjAzcfvvtAMqm43EJDQ1Fbm5u7bSMiIiIqIkLDAxEfn6+x7KLFy+6p/ur6XpX0A4KCrrkfalMjXuYw8PDcerUqUrXHThwALGxsVfcqLrGeZgbBs6Pqow14401o4w14401o4w143tpaWl46aWX4HA43MMydu7cienTp7vX79q1y719Xl4ejh07hrS0NI/1ffv2dd83Pj4eISEhaNOmDSRJwt69e9GuXTv3etd9qUyNA/MNN9yA2bNno0+fPmjVqhUA5wvO6dOnMX/+fNx444213sjaxnmYGwbOj6qMNeONNaOMNeONNaPM32qmPju7pkS/W2+PBQA2m83943A4UFJSAlmWMXjwYOj1erzyyiu4//778cUXXyAzMxNjx44FAEycOBG9e/fG2rVrkZ6ejlmzZiE9PR0pKSkAgMmTJ+Pll1/GyJEjYTQaMXfuXEydOhWA84Pi+PHj8dRTT2HRokXIzMzE4sWL8dlnn9XrsTcENR6S8fzzzyMqKgqdOnVC7969AQBTp05FamoqQkJCMGfOnNpuIxEREVGjNnfuXBgMBsybNw/Lly+HwWDAXXfdBY1Gg5UrV+Lzzz9HaGgo5s2bhxUrViA8PBwA0K5dO7z//vuYNm0aIiIisH//fixdutS932nTpmHChAno3r07UlJS0KVLF8ycOdO9fsGCBZAkCbGxsbj22mvxzDPPYOjQofV+/P5OEpfxHZTVasXHH3+M1atXIzc3F+Hh4Rg+fDgmTZoErVZbF+2sVf44ztrfPsX7A1mWERYWhry8PPb8VII14401o4w14401o8zfaqbilGt1qa6Om0NcGqYaD8kAnNPHTZkyBVOmTKnt9hARERER+ZUaB+aCggKYzWaPT3mffPIJ9u7di6FDh7Ibn4iIiIgalRqPYZ44cSKeeuop9+1nnnkGt99+O/7973/jqquu4kBxIiIiImpUahyYf/vtN4wYMQIAIITAggULMGPGDOTm5uIf//gHXn755VpvJBERERGRr9Q4MJ8/f949HGP79u3Izc11T08yevRo7N+/v3ZbSERERETkQzUOzDExMfjzzz8BAN988w2SkpKQnJwMADCZTFCrL+s8QiIiIiIiv1TjdHvTTTfh0UcfxY8//oj//e9/eOyxx9zrduzYgdatW9dqA+sCr/TXMPAKXMpYM95YM8pYM95YM8qacs001eOmytU4MD///PMICgrCb7/9hocffhhPPPGEe9327dsxYcKEWm1gXeCV/hoGXoFLGWvGG2tGGWvGG2tGmb/VjL91dlHTUePArFarMWvWrErXffXVV1fcICIiIiIif1KtwGy1WqHRaGq888u9HxEREZEv8Up/VF61TvpLSkrCq6++ivPnz1drp5s3b8bYsWPx4osvXlHjiIiIiIh8rVo9zAsXLsTMmTPx+OOPY9CgQejXrx86duyIqKgo6HQ6XLhwAUeOHMH27dvx3XffITc3F9OnT8ff/va3um4/EREREVGdqlZgHjVqFEaNGoW1a9diyZIleO+993Dy5EkAzjOMhRDQarXo3r07HnzwQdx+++0el84mIiIiImqoanTS39ChQzF06FAAwOnTp5GdnY2SkhKEh4ejZcuW0Gq1ddJIIiIiIiJfueyrjMTExCAmJqY220JERERE5HdqfKU/IiIiIqpdb775Jnr06AGdTodbbrnFY11GRgb69OmDgIAApKWlYdOmTR7rP//8cyQnJ8NoNGLEiBHuYbMuM2fORGRkJEJDQzF9+nRYrVb3ugsXLmDChAkICgpC8+bN8dZbb9XosZsKBmYiIiIiH4uLi8PMmTNx1113eSy3Wq0YPXo0xo4di7y8PDz++OMYM2YM8vLyAAD79u3DlClT8M477yA3NxetW7fGrbfe6r7/e++9h2XLlmHbtm04ePAgfv/9d8ydO9e9/t5774XNZsOpU6ewatUqPPXUU1i3bl21HrspYWAmIiIi8rFx48bhhhtu8Jo0Yf369SgqKsIjjzwCnU6HiRMnomXLlvjyyy8BAB999BGuvfZaDB8+HAaDAc8++yy2bNmCw4cPAwAWLVqEf/7zn0hKSkJUVBRmzpyJDz74AABgMpmwfPlyzJ07F0FBQejatSsmT57sXn+px25KGJiJiIiI/FRGRgY6duwIlaossnXp0gUZGRnu9Z07d3avCw8PR0JCQpXru3TpghMnTuDixYs4cOAAhBBo3759lftWeuym5LJP+mvItFqt312PXq1W8+o/FUiSBAAwGo0QQvi4Nf6HNeONNaOMNeONNaOsKdfMXUdz6mS/y9Jq9nwWFhYiJCTEY1loaCguXryouN51pcKK60NDQwE4r2RYWFiI4ODgat+34mM3JZcVmK1WK95//3389ttvOH78OBYsWIDWrVvjP//5Dzp16oR27drVdjtrlcVigcVi8XUzPAQFBdXZZTgbKlmWodVqYTKZYLfbfd0cv8Oa8caaUcaa8caaUeZvNeNvnV31ITAwEPn5+R7LLl686P4gU9P1rrAbFBR0xftuSmo8JCMzMxOpqal45JFHsH//fqxZs8b9x7Rx40a89NJLtd5IIiIioqYoLS0Ne/bsgcPhcC/buXMn0tLS3Ot37drlXpeXl4djx45VuX7nzp2Ij49HSEgI2rRpA0mSsHfv3ir3rfTYTUmNe5jvv/9+REVF4ddff0VoaKjHxUoGDRqEJ554olYbSERERFTf3k2MrtfHs9ls7h+Hw4GSkhLIsozBgwdDr9fjlVdewf33348vvvgCmZmZGDt2LABg4sSJ6N27N9auXYv09HTMmjUL6enpSElJAQBMnjwZL7/8MkaOHAmj0Yi5c+di6tSpAJxDkcaPH4+nnnoKixYtQmZmJhYvXozPPvsMAC752E1JjXuY169f757PzzX2yyUmJgbZ2dm11jgiIiKipmDu3LkwGAyYN28eli9fDoPBgLvuugsajQYrV67E559/jtDQUMybNw8rVqxAeHg4AKBdu3Z4//33MW3aNERERGD//v1YunSpe7/Tpk3DhAkT0L17d6SkpKBLly6YOXOme/2CBQsgSRJiY2Nx7bXX4plnnnFf1flSj92USKKGZzmEhoZiyZIlGD16NOx2OzQaDbZt24Zu3bph+fLl+Pvf/44zZ87UVXtrRW5urq+b4MXfxon5A1mWERYWhry8PI4trARrxhtrRhlrxhtrRpm/1UzFKdfqUl0dd1Mc/9sY1LiHedCgQXjllVc8rhIjSRKEEHjnnXcwbNiwWm0gEREREZEv1XgM84svvoi+ffuiXbt2GDNmDCRJwoIFC5CRkYGDBw/i119/rYt2EhERERH5RI17mNu2bYvt27ejX79++PTTTyHLMlatWoVWrVrh119/dQ8yJyIiIiJqDC5rHuaWLVviww8/rO22EBERERH5HV4am4iIiIhIwWX1MC9btgzLly/H8ePHUVJS4rFOkiSPCbKJiIiIiBqyGgfmGTNm4IUXXkD37t3Rpk0bjwuXEBERETUGnP6NyqtxYH7//ffxzDPPeEx6TURERETUWNV4DLNKpULv3r3roi1ERERERH6nxj3M06ZNw9KlS3HVVVfVRXuIiIiIfI5X+qPyahyYn3nmGfzjH/9A3759MXz4cISGhnqslyQJDz74YG21j4iIiIjIp2ocmFevXo3FixejsLAQW7du9VrPwExEREREjYkkhBA1uUNqairi4+Px+uuvo02bNtBoNHXVtjqTn58PnU7n62Z4UKvVsNlsvm6GX5EkCVqtFhaLBTUs0yaBNeONNaOMNeONNaPM32qmPt+7OSSDyqtxD/OJEyfw5ptvokOHDnXRnnphsVhgsVh83QwPQUFBdfbH2VDJsgytVguTyQS73e7r5vgd1ow31owy1ow31owyf6sZf+vsoqajxrNkpKen48CBA3XRFiIiIiIiv1PjwPz888/j7bffxrvvvovMzEycP3/e64eIiIiIqu+vf/0rmjdvjuDgYCQlJeG5555zr8vIyECfPn0QEBCAtLQ0bNq0yeO+n3/+OZKTk2E0GjFixAicPHnSY/3MmTMRGRmJ0NBQTJ8+HVar1b3uwoULmDBhAoKCgtC8eXO89dZbHve91GM3FTUOzL1798aff/6Ju+++G61bt0ZUVJTXDxERERFV3wMPPIBDhw4hPz8fmzZtwscff4zly5fDarVi9OjRGDt2LPLy8vD4449jzJgxyMvLAwDs27cPU6ZMwTvvvIPc3Fy0bt0at956q3u/7733HpYtW4Zt27bh4MGD+P333zF37lz3+nvvvRc2mw2nTp3CqlWr8NRTT2HdunUAcMnHbkpqfNLf4sWLIUmS4jZ33HHHFTWqruXm5vq6CV78bZyYP5BlGWFhYcjLy+PYwkqwZryxZpSxZryxZpT5W81ERkbW22P58qS/48eP49prr8Wtt96Knj174vbbb8epU6egUjn7Obt374577rkHd955J5588kkcPHgQn332GQDg/PnziI6Oxr59+5CSkoJ+/frhtttuwz333AMA+Prrr3HPPffg+PHjMJlMCA8Px44dO9C+fXsAwEMPPYQzZ87go48+wurVqxUfuymp8Ul/kydProNmEBERETVtTzzxBF5//XUUFRUhMTEREydOxBdffIGOHTu6AysAdOnSBRkZGQCcQyZ69erlXhceHo6EhARkZGQgJSUFGRkZ6Ny5s8d9T5w4gYsXLyIzMxNCCHdYdq3/v//7P/e+lR67KalxYCYiIiJq7L66K6dO9jtpWdU9zM8//zyee+45bNu2Df/9738RFhaGwsJChISEeGwXGhqKixcvAkCV61095BXXuy44V1BQgMLCQgQHB1f7vhUfuympVmDu1KkTli5dirS0NHTs2FFxSIYkSdi1a1etNZCIiIioqZAkCT179sR3332HOXPmID4+Hvn5+R7bXLx40T20IzAwsEbrXWE3KCioxvetuL4pqVZg7t69O4xGo/v3S41hJiIiIqLLZ7PZcOjQIVxzzTV46aWX4HA43EMjdu7cienTpwMA0tLSPDoq8/LycOzYMaSlpXms79u3r/u+8fHxCAkJQZs2bSBJEvbu3Yt27dq515e/r9JjNyXVCsxDhgxxd9kvXry4LttDRERE5HNj342ut8e6ePEiVq5ciTFjxiAwMBA///wz3n77bTz11FMYPHgw9Ho9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JsJms3nclmUZkiQBAF577TX07dsXH3zwASwWCwDg6NGj6NevH/72t79Br9fjp59+wp133gkhhDssms1mDB06FFlZWZg9ezY6duyI48ePu0PiW2+9hYkTJyIgIADz588HAMTHx1favuPHj2PAgAFISkrChx9+CLvdjtmzZ2PAgAHYvXu3O8gDwJtvvokBAwbgww8/xP79+/Hoo48iOjoaL7zwQo2eE4fDgRMnTqBr167uZdu3b8fw4cMxYMAAfPbZZzh//jwef/xxDB06FNu3b4der8fAgQPxwQcfuO+zceNG6PV6bNy4EUIISJLkXtarVy8AwOjRo9GsWTO8//77CAkJwaFDh3DixIkatZeIiHxEEFGjNnv2bAHA6+ejjz4SQggBQHTo0EE4HI4q9+FwOITVahV//etfRXp6unv5O++8IwCILVu2VHnfQYMGieuuu85r+R133CE6dOjgvv3ggw+KgIAAcebMGfeyrKwsodFoxOzZs93LAIiePXt67Ou2224TKSkpVT8JQohFixYJAOL06dPCarWK06dPi4ceekjodDrx008/ubcbO3asiI+PF2az2b1sy5YtAoBYtGiREEKItWvXCgDiyJEjQgghbrzxRjF9+nQhy7LYs2eP+/gGDRokhBDi7NmzAoBYuXKlYhuJiMg/sYeZqAkwGAzYuHGjx7Lk5GT379dee627t9klLy8Ps2fPxn//+1+cPHkSdrsdABAREeHeZs2aNWjXrh3S09OvuI2bNm3C0KFDPXqSExMT0bdvX2zatMlj2xEjRnjcbt++PT7//PNqPU5MTIzH7X//+9/o27evRztuueUWaLVa97L09HQkJiZi06ZNmDx5Mvr06QOtVosNGzYgKSkJmzZtwqJFi/Dbb79hw4YNSEtLw8aNGzFx4kQAzucsMTERTzzxBM6fP49hw4ZV2dNORET+h2OYiZoAlUqFHj16ePyEh4e71zdr1szrPpMnT8ann36Khx9+GD/88AN+++03TJ06FSUlJe5tzp07h7i4uFppY15enleYBZwB9/z58x7LQkNDPW5rtVqYzeZqPc6PP/6IX3/9FV988QXS0tJw//33Y/fu3TVqh8FgQM+ePbFx40bs27cPubm56NevHwYOHIiNGzfi5MmTOHLkCAYNGgTAOe76+++/R7t27fD3v/8dLVq0QPfu3b0+xBARkX9iYCYir97lkpISfPPNN5g5cybuu+8+DB06FD169IDD4fDYLiIiAqdOnaqVNoSHh3ucWOdy+vRpj3B/pTp37oyePXti3Lhx+Pbbb6HRaPDYY4/VuB0DBw7Ehg0bsHHjRnTu3BkhISHuZRs2bIBGo/HoeU9NTcXy5cuRl5eH9evXQ6/X4/rrr0dhYWGtHRsREdUNBmYi8mI2m2G32z2GJRQUFGDlypUe2w0fPhx79+7F1q1bq9yXVqv16JWuSv/+/bFmzRqcO3fOvez48ePYsmULBgwYcBlHcWnx8fF44IEH8N1332HHjh3udqxYsQJWq9W93S+//IKjR496tGPgwIE4fPgwli5d6u5JHjBgAM6cOYN33nkH3bt3R0BAgNdjajQaDBo0CI8//jjy8/Nr7QMHERHVHQZmIvISEhKCnj174oUXXsDnn3+OFStW4KqrrkJISIjHdrfffju6du2KUaNG4Y033sC6devw8ccf469//at7m3bt2mHbtm34+uuvsW3btioD4oMPPgitVosRI0bgyy+/xPLly3H11VcjPDwcf//73+vsWP/5z38iKCgIL774IgDgySefRE5ODkaOHIlVq1ZhyZIlGDduHNq3b+8xV3O/fv0gyzI2bNiAgQMHAnD2TqelpXksA4Ddu3fjqquuwnvvvYd169ZhxYoVmDt3LpKSknw2HzUREVUfAzMRVWrp0qVISUnBHXfcgfvvvx/jx4/3mHsYAHQ6HdasWYMJEybgueeewzXXXIPZs2d7jIl+9NFH0a9fP0yaNAk9e/bEO++8U+njtWjRAhs3bkRkZCRuv/12TJ06Fa1atcKmTZs8TgSsbeHh4bj//vvx+eef4/Dhw+jevTtWr16NoqIijB8/Hg888ACGDBmCNWvWQK/Xu+8XFBSErl27QpIkj55nV29z+cAcExODmJgYPP/887j22mtx9913o0WLFvjhhx8gy3KdHRsREdUOSQghfN0IIiIiIiJ/xR5mIiIiIiIFDMxERERERAoYmImIiIiIFDAwExEREREpYGAmIiIiIlLAwExEREREpICBmYiI6P/brQMBAAAAAEH+1htMUBQBDGEGAIAhzAAAMIQZAACGMAMAwAhBYeQ7WPFHggAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<ggplot: (8738542056949)>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(\n",
" pn.ggplot(\n",
" df.assign(t=lambda df: df.m + df.n).assign(s=lambda df: df.m / df.t)\n",
" .assign(color=lambda df: df.t.astype(str)),\n",
" pn.aes(x='s', y='time', color='color')\n",
" ) + \n",
" pn.geom_line() +\n",
" pn.scale_y_log10() + \n",
" pn.labs(\n",
" title='SVD compressed benchmarks',\n",
" x='Fraction Rows',\n",
" y='Time (seconds)',\n",
" color='N rows + cols'\n",
" )\n",
" #pn.facet_wrap('~ t', scales='free_y')\n",
")"
]
}
],
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment