Advanced Scientific Programming in Python
MATH-661 / 1 credit
Teacher(s): Buffa Annalisa, Hinz Jochen Peter
Language: English
Remark: The course expects participants to at least have an intermediate understanding of the Python programming language
Frequency
Only this year
Summary
This seminar teaches the participants to use advanced Python concepts for writing easier to read, more flexible and faster code. It teaches concepts in a hands-on and tangible fashion, providing example use cases that all applied mathematicians can relate to.
Content
Lecture 1: Idiomatic Python. The first lecture teaches the use of Python "idioms" for writing code that is more readable and extendible.
- What are code characteristics that enhance readability?
- *args, **kwargs and their use. The use of dict.setdefault.
- Pythonic use of "truthiness". Use of `or` and `and` on non-boolean objects.
- Idiomatic variable unpacking with star syntax. Using syntactic sugar to enhance readability and for catching errors early.
- Advanced iteration: enumerate, zip, use of star syntax in loops, for - else clause. The use of map (...)
- Advanced use of list, set, dict. Using comprehensions and iterators to avoid instantiation via for loops.
- Creative use of dictionaries, dict.setdefault, dict.get(item, None) to avoid if-else clauses.
- Use of itertools: loop flattening with itertools.product, counting with itertools.count, zip_longest + tangible use cases from applied math.
- Use of collections: namedtuple, ChainMap, defaultdict + use cases mathematicians can relate to
- dataclass
- The concept of Hashing
- The use of functools and decorators - functools.partial for specialising functions, caching via functools.lru_cache, writing decorators and using functools.wraps, functools.reduce
- Iterating over numpy.ndarray's.
- Writing functions that can handle several input types (achieving multiple dispatch).
- Unit testing.
Lecture 2: Object-oriented Python (requires a basic understanding of OOP)
- The basics of OOP. Favouring out-of-place operations for code robustness wherever computationally feasible.
- The art of catching errors early in __init__.
- Properties, classmethods and staticmethods. Lazy evaluation via functools.cached_property.
- "Magic methods" __call__, __eq__. Implementing comparison >, >=, ...using functools.total_ordering to avoid boilerplate.
- Inheritance and the use of ABC - abstract base classes, abstractmethods, abstractproperties, .... The use of super()
- Structural subtyping as an alternative to ABC - static type checks with mypy.
- Design patterns: factory pattern, strategy pattern, decorator pattern.
- Correctly inheriting from np.ndarray's. Compatibility with numpy broadcasting and ufuncs.
- Admissible use cases of multiple inheritance (MixIns)
- Writing hashable classes
- Writing your own context managers + applications
- The use of collections.abc to correctly inherit from Mapping, Hashable, Container, ...
- The use of self.__class__ to avoid boilerplate
- Application: writing a class capable of representing various mesh types.
Lecture 3: The best of two worlds - writing code that is fast and readable
- Advanced numpy vectorisation - avoiding loops, advanced broadcasting using (slice(...), slice (...), ...) and ellipsis.
- The use of numpy.reshape.
- Parallelisation in Python.
- The differences / similarities between Python and compiled languages like C.
- Writing jit-compiled functions in Numba; Numba parallelization.
- Using the creole language "Cython" to statically type where possible.
- Interfacing with C using ctypes.
- The Python "lowest hanging fruit" tree. The 80-20 rule. Profiling to catch performance
bottlenecks.
Keywords
scientific computing, python
Learning Prerequisites
Required courses
intermediate familiarity with the Python programming language, numpy and (if possible) scipy.
Learning Outcomes
By the end of the course, the student must be able to:
- Compose idiomatic python code, specifically geared toward topics in applied math
Resources
Bibliography
Ipython notebooks will be made available on GitHub.
In the programs
- Exam form: Project report (session free)
- Subject examined: Advanced Scientific Programming in Python
- Courses: 12 Hour(s)
- Type: optional