Skip to content

Instantly share code, notes, and snippets.

@Midnighter
Created February 12, 2014 14:31
Show Gist options
  • Save Midnighter/8956560 to your computer and use it in GitHub Desktop.
Save Midnighter/8956560 to your computer and use it in GitHub Desktop.
Timing tests concerning IPython.parallel performance
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Timing for Remote Parallel Randomisation"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import random\n",
"\n",
"import networkx as nx\n",
"\n",
"from __future__ import (division, print_function)\n",
"\n",
"from IPython.parallel import Client"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our goal is to create random subgraphs from a (not too small) network."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"num_nodes = int(1E03)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"graph = nx.gnp_random_graph(num_nodes, 0.01)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"graph.number_of_edges()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"5078"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"nodes = sorted(graph.nodes_iter())"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sample_size = int(num_nodes * 0.6)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def example_all_passed(net, nodes, size):\n",
" group = random.sample(nodes, size)\n",
" subnet = net.subgraph(group)\n",
" return subnet.size()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Time for doing this task in series."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"random_num = int(1E02)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit sum(example_all_passed(graph, nodes, size) for size in [sample_size] * random_num)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 212 ms per loop\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"random_num = int(1E04)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 29
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit sum(example_all_passed(graph, nodes, size) for size in [sample_size] * random_num)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 21.3 s per loop\n"
]
}
],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Can we do better in parallel?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"rc = Client()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(rc)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"8"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"small_view = rc[:2]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"full_view = rc[:]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Times to import using `execute`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit small_view.execute(\"import random\", block=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100 loops, best of 3: 3.46 ms per loop\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit full_view.execute(\"import random\", block=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100 loops, best of 3: 6.84 ms per loop\n"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Times for running function with all parameters passed."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Smaller number of tasks."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"random_num = int(1E02)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"results = small_view.map(example_all_passed, [graph] * random_num, [nodes] * random_num, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 151 ms per loop\n"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"results = full_view.map(example_all_passed, [graph] * random_num, [nodes] * random_num, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 107 ms per loop\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Larger number of tasks."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"random_num = int(1E04)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"results = small_view.map(example_all_passed, [graph] * random_num, [nodes] * random_num, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 11.5 s per loop\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"results = full_view.map(example_all_passed, [graph] * random_num, [nodes] * random_num, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 5.58 s per loop\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One would think that pushing the large objects to the remote kernels once and then operating on them would be faster."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def example_globals(size):\n",
" group = random.sample(nodes, size)\n",
" subnet = net.subgraph(group)\n",
" return subnet.size()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Times for pushing something to different number of remote kernels."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit small_view.push({\"nodes\": nodes, \"net\": graph}, block=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100 loops, best of 3: 18 ms per loop\n"
]
}
],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit full_view.push({\"nodes\": nodes, \"net\": graph}, block=True)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 49 ms per loop\n"
]
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Smaller number of tasks."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"random_num = int(1E02)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"small_view.push({\"nodes\": nodes, \"net\": graph}, block=True)\n",
"results = small_view.map(example_globals, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 154 ms per loop\n"
]
}
],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"full_view.push({\"nodes\": nodes, \"net\": graph}, block=True)\n",
"results = full_view.map(example_globals, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 118 ms per loop\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Larger number of tasks."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"random_num = int(1E04)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"small_view.push({\"nodes\": nodes, \"net\": graph}, block=True)\n",
"results = small_view.map(example_globals, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 12.1 s per loop\n"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit\n",
"full_view.push({\"nodes\": nodes, \"net\": graph}, block=True)\n",
"results = full_view.map(example_globals, [sample_size] * random_num, block=False)\n",
"sum(results)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 5.73 s per loop\n"
]
}
],
"prompt_number": 28
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment