This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
other:python:jyp_steps [2016/01/29 15:41] jypeter Added the numpy for matlab users references |
other:python:jyp_steps [2016/02/19 15:17] jypeter Added more debugger mode instructions |
||
---|---|---|---|
Line 49: | Line 49: | ||
Where: [[http://docs.scipy.org/doc/|html and pdf documentation]] | Where: [[http://docs.scipy.org/doc/|html and pdf documentation]] | ||
- | How to get started? | + | ==== Getting started ==== |
- always remember that indices start at ''0'' and that the last element of an array is at index ''-1''!\\ First learn about //indexing// and //slicing// by manipulating strings, as shown in [[#part1|Part 1]] above (try '''This document by JY is awesome!'[::-1]'' and '''This document by JY is awesome!'[slice(None, None, -1)]'') 8-) | - always remember that indices start at ''0'' and that the last element of an array is at index ''-1''!\\ First learn about //indexing// and //slicing// by manipulating strings, as shown in [[#part1|Part 1]] above (try '''This document by JY is awesome!'[::-1]'' and '''This document by JY is awesome!'[slice(None, None, -1)]'') 8-) | ||
- if you are a Matlab user (but the references are interesting for others as well), you can read the following: | - if you are a Matlab user (but the references are interesting for others as well), you can read the following: | ||
Line 59: | Line 60: | ||
- Numpy Reference Guide | - Numpy Reference Guide | ||
- Scipy Reference Guide | - Scipy Reference Guide | ||
+ | |||
+ | ==== Beware of the array view side effects ==== | ||
+ | |||
+ | <note warning>When you take a slice of an array, you get a **//View//** : an array that has a new shape but that still shares its data with the first array. | ||
+ | |||
+ | That is not a problem when you only read the values, but **if you change the values of the //View//, you change the values of the first array** (and vice-versa)! If that is not what want, do not forget to **make a copy** of the data before working on it! | ||
+ | |||
+ | //Views// are a good thing most of the time, so only make a copy of your data when needed, because otherwise copying a big array will just be a waste of CPU and computer memory. Anyway, it is always better to understand what you are doing... :-P | ||
+ | |||
+ | Check the example below and the [[https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#copies-and-views|copies and views]] part of the quickstart tutorial. | ||
+ | |||
+ | <code python> | ||
+ | >>> import numpy as np | ||
+ | >>> a = np.arange(30).reshape((3,10)) | ||
+ | >>> a | ||
+ | array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], | ||
+ | [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], | ||
+ | [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]) | ||
+ | |||
+ | >>> b = a[1, :] | ||
+ | >>> b | ||
+ | array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) | ||
+ | |||
+ | >>> b[3:7] = 0 | ||
+ | >>> b | ||
+ | array([10, 11, 12, 0, 0, 0, 0, 17, 18, 19]) | ||
+ | |||
+ | >>> a | ||
+ | array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], | ||
+ | [10, 11, 12, 0, 0, 0, 0, 17, 18, 19], | ||
+ | [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]) | ||
+ | |||
+ | >>> a[:, 2:4] = -1 | ||
+ | >>> a | ||
+ | array([[ 0, 1, -1, -1, 4, 5, 6, 7, 8, 9], | ||
+ | [10, 11, -1, -1, 0, 0, 0, 17, 18, 19], | ||
+ | [20, 21, -1, -1, 24, 25, 26, 27, 28, 29]]) | ||
+ | |||
+ | >>> b | ||
+ | array([10, 11, -1, -1, 0, 0, 0, 17, 18, 19]) | ||
+ | |||
+ | >>> c = a[1, :].copy() | ||
+ | >>> c | ||
+ | array([10, 11, -1, -1, 0, 0, 0, 17, 18, 19]) | ||
+ | |||
+ | >>> c[:] = 9 | ||
+ | >>> c | ||
+ | array([9, 9, 9, 9, 9, 9, 9, 9, 9, 9]) | ||
+ | |||
+ | >>> b | ||
+ | array([10, 11, -1, -1, 0, 0, 0, 17, 18, 19]) | ||
+ | |||
+ | >>> a | ||
+ | array([[ 0, 1, -1, -1, 4, 5, 6, 7, 8, 9], | ||
+ | [10, 11, -1, -1, 0, 0, 0, 17, 18, 19], | ||
+ | [20, 21, -1, -1, 24, 25, 26, 27, 28, 29]]) | ||
+ | </code></note> | ||
===== cdms2 and netCDF4 ===== | ===== cdms2 and netCDF4 ===== | ||
Line 131: | Line 189: | ||
* [[http://blog.codinghorror.com/a-pragmatic-quick-reference/|A Pragmatic Quick Reference]] | * [[http://blog.codinghorror.com/a-pragmatic-quick-reference/|A Pragmatic Quick Reference]] | ||
+ | |||
+ | ===== Debugging your code ===== | ||
+ | |||
+ | There is only so much you can do with staring at your code in your favorite text editor, and adding ''print'' lines in your code (or using [[https://docs.python.org/2/howto/logging.html#logging-basic-tutorial|logging]] instead of ''print''). The next step is to **use the python debugger**! | ||
+ | |||
+ | ==== Debugging in text mode ==== | ||
+ | |||
+ | - Start the script with: ''python -m pdb my_script.py'' | ||
+ | - Type ''run'' (or **r**) to go to the first line of the script | ||
+ | - Type ''continue'' (or **c**) to execute the script to the end, or till the first breakpoint or error is reached | ||
+ | - Use ''where'' (or **w**) to check the call stack that led to the current stop. Use ''up'' and ''down'' to navigate through the call stack and examine the values of the functions' parameters | ||
+ | - Type ''break NNN'' to stop at line NNN | ||
+ | - Use ''type(var)'' and ''print var'' to check the type and values of variables. You can also change the variables' values on the fly! | ||
+ | - Type ''run'' (or **r**) to restart the script | ||
+ | - Use ''next'' and ''step'' to execute some parts of the script line by line. If a code line calls a function: | ||
+ | * ''next'' (or **n**) will execute a function and stop on the next line | ||
+ | * ''step'' (or **s**) will stop at the first line **inside the function** | ||
+ | - Check the [[https://docs.python.org/2/library/pdb.html#debugger-commands|debugger commands]] for details, or type ''help'' in the debugger for using the built-in help | ||
+ | |||
+ | ==== Using pydebug ==== | ||
+ | |||
+ | Depending on the distribution, the editor and the programming environment you use, you may have access to a graphical version of the debugger. UV-CDAT users can use ''pydebug my_script.py'' | ||
===== Improving the performance of your code ===== | ===== Improving the performance of your code ===== |