"
]
}
],
"prompt_number": 73
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Assembling strings\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, I wanted to compare different methods string \u201cassembly.\u201d This is different from simple string concatenation, which we have seen in the previous section, since we insert values into a string, e.g., from a variable."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"def plus_operator():\n",
" return 'a' + str(1) + str(2) \n",
" \n",
"def format_method():\n",
" return 'a{}{}'.format(1,2)\n",
" \n",
"def binary_operator():\n",
" return 'a%s%s' %(1,2)\n",
"\n",
"%timeit plus_operator()\n",
"%timeit format_method()\n",
"%timeit binary_operator()\n",
"\n",
"#\n",
"# Python 3.4.0\n",
"# MacOS X 10.9.2\n",
"# 2.5 GHz Intel Core i5\n",
"# 4 GB 1600 Mhz DDR3\n",
"#"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1000000 loops, best of 3: 764 ns per loop\n",
"1000000 loops, best of 3: 494 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000000 loops, best of 3: 79.3 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Testing if a string is an integer"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"def string_is_int(a_str):\n",
" try:\n",
" int(a_str)\n",
" return True\n",
" except ValueError:\n",
" return False\n",
"\n",
"an_int = '123'\n",
"no_int = '123abc'\n",
"\n",
"%timeit string_is_int(an_int)\n",
"%timeit string_is_int(no_int)\n",
"%timeit an_int.isdigit()\n",
"%timeit no_int.isdigit()\n",
"\n",
"#\n",
"# Python 3.4.0\n",
"# MacOS X 10.9.2\n",
"# 2.5 GHz Intel Core i5\n",
"# 4 GB 1600 Mhz DDR3\n",
"#"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1000000 loops, best of 3: 401 ns per loop\n",
"100000 loops, best of 3: 3.04 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000000 loops, best of 3: 92.1 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000000 loops, best of 3: 96.3 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Testing if a string is a number"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"def string_is_number(a_str):\n",
" try:\n",
" float(a_str)\n",
" return True\n",
" except ValueError:\n",
" return False\n",
" \n",
"a_float = '1.234'\n",
"no_float = '123abc'\n",
"\n",
"a_float.replace('.','',1).isdigit()\n",
"no_float.replace('.','',1).isdigit()\n",
"\n",
"%timeit string_is_number(an_int)\n",
"%timeit string_is_number(no_int)\n",
"%timeit a_float.replace('.','',1).isdigit()\n",
"%timeit no_float.replace('.','',1).isdigit()\n",
"\n",
"#\n",
"# Python 3.4.0\n",
"# MacOS X 10.9.2\n",
"# 2.5 GHz Intel Core i5\n",
"# 4 GB 1600 Mhz DDR3\n",
"#"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1000000 loops, best of 3: 400 ns per loop\n",
"1000000 loops, best of 3: 1.15 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000000 loops, best of 3: 452 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000000 loops, best of 3: 394 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# List operations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## List reversing - `[::-1]` vs. `reverse()` vs. `reversed()`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"def reverse_func(my_list):\n",
" new_list = my_list[:]\n",
" new_list.reverse()\n",
" return new_list\n",
" \n",
"def reversed_func(my_list):\n",
" return list(reversed(my_list))\n",
"\n",
"def reverse_slizing(my_list):\n",
" return my_list[::-1]\n",
"\n",
"%timeit reverse_func([1,2,3,4,5])\n",
"%timeit reversed_func([1,2,3,4,5])\n",
"%timeit reverse_slizing([1,2,3,4,5])\n",
"\n",
"# Python 3.4.0\n",
"# MacOS X 10.9.2\n",
"# 2.4 GHz Intel Core Duo\n",
"# 8 GB 1067 Mhz DDR3\n",
"#"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1000000 loops, best of 3: 930 ns per loop\n",
"1000000 loops, best of 3: 1.89 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000000 loops, best of 3: 775 ns per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Creating lists using conditional statements\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"In this test, I attempted to figure out the fastest way to create a new list of elements that meet a certain criterion. For the sake of simplicity, the criterion was to check if an element is even or odd, and only if the element was even, it should be included in the list. For example, the resulting list for numbers in the range from 1 to 10 would be \n",
"[2, 4, 6, 8, 10].\n",
"\n",
"Here, I tested three different approaches: \n",
"1) a simple for loop with an if-statement check (`cond_loop()`) \n",
"2) a list comprehension (`list_compr()`) \n",
"3) the built-in filter() function (`filter_func()`) \n",
"\n",
"Note that the filter() function now returns a generator in Python 3, so I had to wrap it in an additional list() function call."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"def cond_loop():\n",
" even_nums = []\n",
" for i in range(100):\n",
" if i % 2 == 0:\n",
" even_nums.append(i)\n",
" return even_nums\n",
"\n",
"def list_compr():\n",
" even_nums = [i for i in range(100) if i % 2 == 0]\n",
" return even_nums\n",
" \n",
"def filter_func():\n",
" even_nums = list(filter((lambda x: x % 2 != 0), range(100)))\n",
" return even_nums\n",
"\n",
"%timeit cond_loop()\n",
"%timeit list_compr()\n",
"%timeit filter_func()\n",
"\n",
"#\n",
"# Python 3.4.0\n",
"# MacOS X 10.9.2\n",
"# 2.5 GHz Intel Core i5\n",
"# 4 GB 1600 Mhz DDR3\n",
"#"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100000 loops, best of 3: 14.4 \u00b5s per loop\n",
"100000 loops, best of 3: 12 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000 loops, best of 3: 23.9 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Dictionary operations "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Adding elements to a Dictionary\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"All three functions below count how often different elements (values) occur in a list. \n",
"E.g., for the list ['a', 'b', 'a', 'c'], the dictionary would look like this: \n",
"`my_dict = {'a': 2, 'b': 1, 'c': 1}`"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import random\n",
"import timeit\n",
"from collections import defaultdict\n",
"\n",
"\n",
"def add_element_check1(elements):\n",
" d = dict()\n",
" for e in elements:\n",
" if e not in d:\n",
" d[e] = 1\n",
" else:\n",
" d[e] += 1\n",
" return d\n",
" \n",
"def add_element_check2(elements):\n",
" d = dict()\n",
" for e in elements:\n",
" if e not in d:\n",
" d[e] = 0\n",
" d[e] += 1 \n",
" return d\n",
" \n",
"def add_element_except(elements):\n",
" d = dict()\n",
" for e in elements:\n",
" try:\n",
" d[e] += 1\n",
" except KeyError:\n",
" d[e] = 1\n",
" return d\n",
" \n",
"def add_element_defaultdict(elements):\n",
" d = defaultdict(int)\n",
" for e in elements:\n",
" d[e] += 1\n",
" return d\n",
"\n",
"def add_element_get(elements):\n",
" d = dict()\n",
" for e in elements:\n",
" d[e] = d.get(e, 1) + 1\n",
" return d\n",
"\n",
"\n",
"random.seed(123)\n",
"\n",
"print('Results for 100 integers in range 1-10') \n",
"rand_ints = [random.randrange(1, 10) for i in range(100)]\n",
"%timeit add_element_check1(rand_ints)\n",
"%timeit add_element_check2(rand_ints)\n",
"%timeit add_element_except(rand_ints)\n",
"%timeit add_element_defaultdict(rand_ints)\n",
"%timeit add_element_get(rand_ints)\n",
"\n",
"print('\\nResults for 1000 integers in range 1-5') \n",
"rand_ints = [random.randrange(1, 5) for i in range(1000)]\n",
"%timeit add_element_check1(rand_ints)\n",
"%timeit add_element_check2(rand_ints)\n",
"%timeit add_element_except(rand_ints)\n",
"%timeit add_element_defaultdict(rand_ints)\n",
"%timeit add_element_get(rand_ints)\n",
"\n",
"print('\\nResults for 1000 integers in range 1-1000') \n",
"rand_ints = [random.randrange(1, 1000) for i in range(1000)]\n",
"%timeit add_element_check1(rand_ints)\n",
"%timeit add_element_check2(rand_ints)\n",
"%timeit add_element_except(rand_ints)\n",
"%timeit add_element_defaultdict(rand_ints)\n",
"%timeit add_element_get(rand_ints)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Results for 100 integers in range 1-10\n",
"10000 loops, best of 3: 28 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000 loops, best of 3: 26.2 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000 loops, best of 3: 26.5 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000 loops, best of 3: 22.8 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000 loops, best of 3: 33.3 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Results for 1000 integers in range 1-5\n",
"1000 loops, best of 3: 242 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 239 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 203 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"10000 loops, best of 3: 184 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 350 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Results for 1000 integers in range 1-1000\n",
"1000 loops, best of 3: 262 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 370 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 502 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 422 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"1000 loops, best of 3: 373 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see from the results that the `try-except` variant is faster than then the `if element in my_dict` alternative if we have a low number of unique elements (here: 1000 integers in the range 1-5), which makes sense: the `except`-block is skipped if an element is already added as a key to the dictionary. However, in this case the `collections.defaultdict` has even a better performance. \n",
"However, if we are having a relative large number of unique entries(here: 1000 integers in range 1-1000), the `if element in my_dict` approach outperforms the alternative approaches."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Comprehesions vs. for-loops"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Comprehensions are not only shorter and prettier than ye goode olde for-loop, \n",
"but they are also up to ~1.2x faster."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"n = 1000\n",
"\n",
"#\n",
"# Python 3.4.0\n",
"# MacOS X 10.9.2\n",
"# 2.5 GHz Intel Core i5\n",
"# 4 GB 1600 Mhz DDR3\n",
"#"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Set comprehensions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def set_loop(n):\n",
" a_set = set()\n",
" for i in range(n):\n",
" if i % 3 == 0:\n",
" a_set.add(i)\n",
" return a_set"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def set_compr(n):\n",
" return {i for i in range(n) if i % 3 == 0}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit set_loop(n)\n",
"%timeit set_compr(n)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10000 loops, best of 3: 136 \u00b5s per loop\n",
"10000 loops, best of 3: 113 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## List comprehensions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def list_loop(n):\n",
" a_list = list()\n",
" for i in range(n):\n",
" if i % 3 == 0:\n",
" a_list.append(i)\n",
" return a_list"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def list_compr(n):\n",
" return [i for i in range(n) if i % 3 == 0]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit list_loop(n)\n",
"%timeit list_compr(n)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10000 loops, best of 3: 129 \u00b5s per loop\n",
"10000 loops, best of 3: 111 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dictionary comprehensions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def dict_loop(n):\n",
" a_dict = dict()\n",
" for i in range(n):\n",
" if i % 3 == 0:\n",
" a_dict[i] = i\n",
" return a_dict"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def dict_compr(n):\n",
" return {i:i for i in range(n) if i % 3 == 0}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit dict_loop(n)\n",
"%timeit dict_compr(n)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10000 loops, best of 3: 121 \u00b5s per loop\n",
"10000 loops, best of 3: 127 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Copying files by searching directory trees"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Executing `Unix`/`Linux` shell commands:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import subprocess\n",
"\n",
"def subprocess_findcopy(path, search_str, dest): \n",
" query = 'find %s -name \"%s\" -exec cp {} %s \\;' %(path, search_str, dest)\n",
" subprocess.call(query, shell=True)\n",
" return "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using Python's `os.walk()` to search the directory tree recursively and matching patterns via `fnmatch.filter()`"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import shutil\n",
"import os\n",
"import fnmatch\n",
"\n",
"def walk_findcopy(path, search_str, dest):\n",
" for path, subdirs, files in os.walk(path):\n",
" for name in fnmatch.filter(files, search_str):\n",
" try:\n",
" shutil.copy(os.path.join(path,name), dest)\n",
" except NameError:\n",
" pass\n",
" return"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"\n",
"def findcopy_timeit(inpath, outpath, search_str):\n",
" \n",
" shutil.rmtree(outpath)\n",
" os.mkdir(outpath)\n",
" print(50*'#')\n",
" print('subprocsess call')\n",
" %timeit subprocess_findcopy(inpath, search_str, outpath)\n",
" print(\"copied %s files\" %len(os.listdir(outpath)))\n",
" shutil.rmtree(outpath)\n",
" os.mkdir(outpath)\n",
" print('\\nos.walk approach')\n",
" %timeit walk_findcopy(inpath, search_str, outpath)\n",
" print(\"copied %s files\" %len(os.listdir(outpath)))\n",
" print(50*'#')\n",
"\n",
"print('small tree')\n",
"inpath = '/Users/sebastian/Desktop/testdir_in'\n",
"outpath = '/Users/sebastian/Desktop/testdir_out'\n",
"search_str = '*.png'\n",
"findcopy_timeit(inpath, outpath, search_str)\n",
"\n",
"print('larger tree')\n",
"inpath = '/Users/sebastian/Dropbox'\n",
"outpath = '/Users/sebastian/Desktop/testdir_out'\n",
"search_str = '*.csv'\n",
"findcopy_timeit(inpath, outpath, search_str)\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"small tree\n",
"##################################################"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"subprocsess call\n",
"1 loops, best of 3: 268 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"copied 13 files\n",
"\n",
"os.walk approach\n",
"100 loops, best of 3: 12.2 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"copied 13 files\n",
"##################################################\n",
"larger tree\n",
"##################################################\n",
"subprocsess call\n",
"1 loops, best of 3: 623 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"copied 105 files\n",
"\n",
"os.walk approach\n",
"1 loops, best of 3: 417 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"copied 105 files\n",
"##################################################\n"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I have to say that I am really positively surprised. The shell's `find` scales even better than expected!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"
\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Returning column vectors slicing through a numpy array"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given a numpy matrix, I want to iterate through it and return each column as a 1-column vector. \n",
"E.g., if I want to return the 1st column from matrix A below\n",
"\n",
"\n",
"A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])\n",
">>> A\n",
"array([[1, 2, 3],\n",
" [4, 5, 6],\n",
" [7, 8, 9]])
\n",
"\n",
"I want my result to be:\n",
"\n",
"array([[1],\n",
" [4],\n",
" [7]])
\n",
"\n",
"with `.shape` = `(3,1)`\n",
"\n",
"\n",
"However, the default behavior of numpy is to return the column as a row vector:\n",
"\n",
"\n",
">>> A[:,0]\n",
"array([1, 4, 7])\n",
">>> A[:,0].shape\n",
"(3,)\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"\n",
"# 1st column, e.g., A[:,0,np.newaxis]\n",
"\n",
"def colvec_method1(A):\n",
" for col in A.T:\n",
" colvec = row[:,np.newaxis]\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 83
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 1st column, e.g., A[:,0:1]\n",
"\n",
"def colvec_method2(A):\n",
" for idx in range(A.shape[1]):\n",
" colvec = A[:,idx:idx+1]\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 82
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 1st column, e.g., A[:,0].reshape(-1,1)\n",
"\n",
"def colvec_method3(A):\n",
" for idx in range(A.shape[1]):\n",
" colvec = A[:,idx].reshape(-1,1)\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 81
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 1st column, e.g., np.vstack(A[:,0]\n",
"\n",
"def colvec_method4(A):\n",
" for idx in range(A.shape[1]):\n",
" colvec = np.vstack(A[:,idx])\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 79
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 1st column, e.g., np.row_stack(A[:,0])\n",
"\n",
"def colvec_method5(A):\n",
" for idx in range(A.shape[1]):\n",
" colvec = np.row_stack(A[:,idx])\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 77
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 1st column, e.g., np.column_stack((A[:,0],))\n",
"\n",
"def colvec_method6(A):\n",
" for idx in range(A.shape[1]):\n",
" colvec = np.column_stack((A[:,idx],))\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 74
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 1st column, e.g., A[:,[0]]\n",
"\n",
"def colvec_method7(A):\n",
" for idx in range(A.shape[1]):\n",
" colvec = A[:,[idx]]\n",
" yield colvec"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 89
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def test_method(method, A):\n",
" for i in method(A): \n",
" assert i.shape == (A.shape[0],1), \"{}, {}\".format(i.shape, A.shape[0],1)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 69
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"A = np.random.random((300, 3))\n",
"\n",
"for method in [\n",
" colvec_method1, colvec_method2, \n",
" colvec_method3, colvec_method4, \n",
" colvec_method5, colvec_method6,\n",
" colvec_method7]:\n",
" print('\\nTest:', method.__name__)\n",
" %timeit test_method(colvec_method2, A)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Test: colvec_method1\n",
"100000 loops, best of 3: 16.6 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Test: colvec_method2\n",
"10000 loops, best of 3: 16.1 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Test: colvec_method3\n",
"100000 loops, best of 3: 16.2 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Test: colvec_method4\n",
"100000 loops, best of 3: 16.4 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Test: colvec_method5\n",
"100000 loops, best of 3: 16.2 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Test: colvec_method6\n",
"100000 loops, best of 3: 16.8 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"Test: colvec_method7\n",
"100000 loops, best of 3: 16.3 \u00b5s per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 91
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Speed of numpy functions vs Python built-ins and std. lib."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import timeit\n",
"\n",
"samples = list(range(1000000))\n",
"\n",
"%timeit(sum(samples))\n",
"%timeit(np.sum(samples))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100 loops, best of 3: 18.3 ms per loop\n",
"10 loops, best of 3: 136 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit(list(range(1000000)))\n",
"%timeit(np.arange(1000000))\n",
"\n",
"# note that in Python range() is implemented as xrange()\n",
"# with lazy evaluation (generator)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 82.6 ms per loop\n",
"100 loops, best of 3: 5.35 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import statistics\n",
"\n",
"%timeit(statistics.mean(samples))\n",
"%timeit(np.mean(samples))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 1.14 s per loop\n",
"10 loops, best of 3: 141 ms per loop"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"
\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Cython vs regular (C)Python"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[[back to top](#sections)]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def py_lstsqr(x, y):\n",
" \"\"\" Computes the least-squares solution to a linear matrix equation. \"\"\"\n",
"\n",
" x_avg = sum(x)/len(x)\n",
" y_avg = sum(y)/len(y)\n",
" var_x = 0\n",
" cov_xy = 0\n",
" for x_i, y_i in zip(x,y):\n",
" temp = (x_i - x_avg)\n",
" var_x += temp**2\n",
" cov_xy += temp*(y_i - y_avg)\n",
" slope = cov_xy / var_x\n",
" y_interc = y_avg - slope*x_avg\n",
" return (slope, y_interc)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 62
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load_ext cythonmagic"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 58
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython\n",
"\n",
"def cy_lstsqr(x, y):\n",
" \"\"\" Computes the least-squares solution to a linear matrix equation. \"\"\"\n",
" cdef double x_avg, y_avg, temp, var_x, cov_xy, slope, y_interc, x_i, y_i\n",
" x_avg = sum(x)/len(x)\n",
" y_avg = sum(y)/len(y)\n",
" var_x = 0\n",
" cov_xy = 0\n",
" for x_i, y_i in zip(x,y):\n",
" temp = (x_i - x_avg)\n",
" var_x += temp**2\n",
" cov_xy += temp*(y_i - y_avg)\n",
" slope = cov_xy / var_x\n",
" y_interc = y_avg - slope*x_avg\n",
" return (slope, y_interc)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 63
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"import random\n",
"random.seed(12345)\n",
"\n",
"funcs = ['py_lstsqr', 'cy_lstsqr']\n",
"\n",
"orders_n = [10**n for n in range(1, 6)]\n",
"times_n = {f:[] for f in funcs}\n",
"\n",
"for n in orders_n:\n",
" x = [x_i*random.randrange(8,12)/10 for x_i in range(n)]\n",
" y = [y_i*random.randrange(10,14)/10 for y_i in range(n)]\n",
" for f in funcs:\n",
" times_n[f].append(min(timeit.Timer('%s(x,y)' %f, \n",
" 'from __main__ import %s, x, y' %f)\n",
" .repeat(repeat=3, number=1000)))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 64
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib.pyplot as plt\n",
"\n",
"labels = [('py_lstsqr', 'regular Python (CPython)'), \n",
" ('cy_lstsqr', 'Cython implementation')]\n",
"\n",
"\n",
"matplotlib.rcParams.update({'font.size': 12})\n",
"\n",
"fig = plt.figure(figsize=(10,8))\n",
"for lb in labels:\n",
" plt.plot(orders_n, times_n[lb[0]], alpha=0.5, label=lb[1], marker='o', lw=3)\n",
"plt.xlabel('sample size n')\n",
"plt.ylabel('time per computation in milliseconds [ms]')\n",
"plt.xlim([1,max(orders_n) + max(orders_n) * 10])\n",
"plt.legend(loc=2)\n",
"plt.grid()\n",
"plt.xscale('log')\n",
"plt.yscale('log')\n",
"ftext = 'Cython % is {:.2f}x faster than (C)Python'\\\n",
" .format(times_n['py_lstsqr'][-1]\\\n",
" /times_n['cy_lstsqr'][-1])\n",
"plt.figtext(.14,.75, ftext, fontsize=11, ha='left')\n",
"plt.title('Performance of least square fit implementations in Cython and (C)Python')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
""
]
}
],
"prompt_number": 67
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}