Skip to content

Instantly share code, notes, and snippets.

@hovren
Created July 21, 2015 08:06
Show Gist options
  • Save hovren/bf5335ba45cd7eee811e to your computer and use it in GitHub Desktop.
Save hovren/bf5335ba45cd7eee811e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:1697e24866f08a382fe337c9166ea258a70dcba7998702c5f4a1c54807e6795e"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"from collections import Counter\n",
"from itertools import chain\n",
"import timeit\n",
"from bisect import insort\n",
"import numpy as np\n",
"from collections import namedtuple\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Person = namedtuple('Person', ('birth', 'death'))\n",
"\n",
"def get_data():\n",
" return [(1920, 1939), (1911, 1944), (1920, 1955), (1938, 1939), (1937, 1940),\n",
" (1910, 1999), (1921, 1955)]\n",
"\n",
"\n",
"def get_data2():\n",
" return [Person(1920, 1939), Person(1911, 1944),\n",
" Person(1920, 1955), Person(1938, 1939), Person(1937, 1940),\n",
" Person(1910, 1999), Person(1921, 1955)]\n",
"\n",
"\n",
"def test_most_populated():\n",
" most_populated(get_data(), False)\n",
"\n",
"\n",
"def most_populated(population, single=True):\n",
" years = dict()\n",
" unborn = sorted(population, key=lambda x: -x[0])\n",
" alive = []\n",
" dead = []\n",
" for year in range(unborn[-1][0], max(population, key=lambda x: x[1])[1] + 1):\n",
" while unborn and unborn[-1][0] == year:\n",
" insort(alive, -unborn.pop()[1])\n",
" while alive and alive[-1] == -(year - 1):\n",
" dead.append(-alive.pop())\n",
" years[year] = len(alive)\n",
" return max(years, key=years.get) if single else \\\n",
" [key for key, val in years.iteritems() if val == max(years.values())]\n",
"\n",
"\n",
"def test_most_populated2():\n",
" most_populated2(get_data())\n",
"\n",
"\n",
"def most_populated2(pop):\n",
" pop_flat = chain.from_iterable(xrange(i, j+1) for i, j in pop)\n",
" return Counter(pop_flat).most_common()\n",
"\n",
"\n",
"def test_most_populated3():\n",
" most_populated3(get_data(), False)\n",
"\n",
"\n",
"def most_populated3(population, single=True):\n",
" birth = map(lambda x: x[0], population)\n",
" death = map(lambda x: x[1] + 1, population)\n",
" b = Counter(birth)\n",
" d = Counter(death)\n",
" alive = 0\n",
" years = {}\n",
" for year in range(min(birth), max(death) + 1):\n",
" alive = alive + b[year] - d[year]\n",
" years[year] = alive\n",
" return max(years, key=years.get) if single else \\\n",
" [key for key, val in years.iteritems() if val == max(years.values())]\n",
"\n",
"\n",
"def test_most_populated4():\n",
" most_populated4(get_data2())\n",
"\n",
"\n",
"def most_populated4(people):\n",
" START_YEAR = 1900\n",
" END_YEAR = 2000\n",
" people_alive = np.zeros(END_YEAR - START_YEAR + 1) # Alive each year\n",
"\n",
" for p in people:\n",
" a = p.birth - START_YEAR\n",
" b = p.death - START_YEAR + 1 # include year of death\n",
" people_alive[a:b] += 1\n",
"\n",
" # Find indexes of maximum aliveness and convert to year\n",
" most_alive = np.flatnonzero(people_alive == people_alive.max()) + START_YEAR\n",
"\n",
" return most_alive\n",
"\n",
"def most_populated4_nonamed(people):\n",
" START_YEAR = 1900\n",
" END_YEAR = 2000\n",
" people_alive = np.zeros(END_YEAR - START_YEAR + 1) # Alive each year\n",
"\n",
" for birth, death in people:\n",
" a = birth - START_YEAR\n",
" b = death - START_YEAR + 1 # include year of death\n",
" people_alive[a:b] += 1\n",
"\n",
" # Find indexes of maximum aliveness and convert to year\n",
" most_alive = np.flatnonzero(people_alive == people_alive.max()) + START_YEAR\n",
"\n",
" return most_alive\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" print 'njzk2 var1: ' +\\\n",
" str(timeit.timeit(stmt=\"test_most_populated()\",\n",
" setup=\"from __main__ import test_most_populated\",\n",
" number=10000))\n",
" print 'joran-beasley: ' +\\\n",
" str(timeit.timeit(stmt=\"test_most_populated2()\",\n",
" setup=\"from __main__ import test_most_populated2\",\n",
" number=10000))\n",
" print 'njzk2 var2: ' +\\\n",
" str(timeit.timeit(stmt=\"test_most_populated3()\",\n",
" setup=\"from __main__ import test_most_populated3\",\n",
" number=10000))\n",
" print 'hannes: ' +\\\n",
" str(timeit.timeit(stmt=\"test_most_populated4()\",\n",
" setup=\"from __main__ import test_most_populated4\",\n",
" number=10000))\n",
" print most_populated(get_data())\n",
" print most_populated(get_data(), False)\n",
" print most_populated2(get_data())[0:1]\n",
" print most_populated3(get_data())\n",
" print most_populated4(get_data2())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"njzk2 var1: 3.99970316887\n",
"joran-beasley: 1.37669110298"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"njzk2 var2: 4.54069685936"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"hannes: 0.416862010956"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1938\n",
"[1938, 1939]\n",
"[(1938, 7)]\n",
"1938\n",
"[1938 1939]\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def generate_data(N):\n",
" for i in xrange(N):\n",
" birth = np.random.randint(1900, 2000)\n",
" death = np.min((2000, birth + np.random.randint(100)))\n",
" yield (birth, death)\n",
" \n",
"Ns = [5, 10, 100, 1000, 10000]\n",
"\n",
"ALGORITHMS = (\n",
"('most_populated', 'njzk2_var1'),\n",
"('most_populated2', 'joran-beasley'),\n",
"('most_populated3', 'njzk2_var2'),\n",
"('most_populated4', 'hannes'),\n",
"('most_populated4_nonamed', 'hannes_v2'),\n",
")\n",
"\n",
"def person_wrap(data):\n",
" for a, b in data:\n",
" yield Person(a,b)\n",
"\n",
"DATA = {N : list(generate_data(N)) for N in Ns}\n",
"DATA_P = {N : list(person_wrap(DATA[N])) for N in DATA}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"RESULT = { name : [] for _, name in ALGORITHMS }\n",
"for N in Ns:\n",
" for algorithm, name in ALGORITHMS:\n",
" stmt = '{}(DATA[{}])'.format(algorithm, N) if not algorithm == 'most_populated4' else '{}(DATA_P[{}])'.format(algorithm, N)\n",
" setup = 'from __main__ import {}, DATA, DATA_P'.format(algorithm)\n",
" t = timeit.timeit(stmt=stmt, setup=setup, number=1000)\n",
" RESULT[name].append(t)\n",
" print N, name, t\n",
" #res = algorithm(pop) if not name == 'hannes' else algorithm(person_wrap(pop))\n",
"\n",
"for name, data in RESULT.items():\n",
" plt.plot(Ns, data, label=name)\n",
"plt.legend()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"5 njzk2_var1 0.0625810623169\n",
"5"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" joran-beasley 0.0727980136871\n",
"5"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var2 0.082466840744\n",
"5 hannes 0.0336260795593\n",
"5"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes_v2 0.0324599742889\n",
"10"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var1 0.0867168903351\n",
"10"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" joran-beasley 0.156286001205\n",
"10"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var2 0.121297836304\n",
"10"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes 0.0527019500732\n",
"10 hannes_v2 0.0471851825714\n",
"100"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var1 0.277117013931\n",
"100"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" joran-beasley 1.55595612526\n",
"100"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var2 0.267436027527\n",
"100"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes 0.363002061844\n",
"100"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes_v2 0.297168016434\n",
"1000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var1 2.10323095322\n",
"1000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" joran-beasley 16.1795089245\n",
"1000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var2 1.45616197586\n",
"1000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes 3.41505002975\n",
"1000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes_v2 2.77032494545\n",
"10000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var1 33.0711870193\n",
"10000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" joran-beasley 162.717440128\n",
"10000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" njzk2_var2 14.3468158245\n",
"10000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes 33.8645849228\n",
"10000"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" hannes_v2 28.7798521519\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 28,
"text": [
"<matplotlib.legend.Legend at 0x7f9654084990>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nQASDIAiCAPgb6TXE/BNA7yYAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7f962f483ad0>"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"DATA_P[0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "KeyError",
"evalue": "0",
"output_type": "pyerr",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-14-e35bbddc4395>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mDATA_P\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m: 0"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment