Merge branch 'main' of git.aspp.school:ASPP/2024-heraklion-parallel-python

This commit is contained in:
morales-gregorio 2024-08-30 13:36:19 +02:00
commit c03778ca2f
4 changed files with 50 additions and 3 deletions

View file

@ -14,6 +14,7 @@ relative differences between the analytic result and the numerical result
for different values of the number of steps. for different values of the number of steps.
**TASKS**: **TASKS**:
0. Read `numerical_integration.py` and familiarize yourselves with the code. 0. Read `numerical_integration.py` and familiarize yourselves with the code.
1. Update the `main` function so that it calculates the numerical error without 1. Update the `main` function so that it calculates the numerical error without
any parallelization. You can use a for loop or `map`. any parallelization. You can use a for loop or `map`.
@ -23,5 +24,6 @@ for different values of the number of steps.
What speed-up did you get? What speed-up did you get?
**BONUS TASKS (very optional)**: **BONUS TASKS (very optional)**:
5. Implement a parallel version with threads (using `multiprocessing.pool.ThreadPool`). 5. Implement a parallel version with threads (using `multiprocessing.pool.ThreadPool`).
6. Time this version, and hypothetize about the result. 6. Time this version, and hypothetize about the result.

View file

@ -0,0 +1,40 @@
# Computer scientists love the Fibonacci sequence
# [https://en.wikipedia.org/wiki/Fibonacci_sequence], possibly
# described by Acharya Pingala in छन्दःशास्त्र (Chhandaḥśāstra).
#
# The basic definition is that the next item in the sequence
# if the sum of the two preceding items, and the two initial
# items and 0 and 1.
#
# We end up with [0, 1, 1, 2, 3, 5, 8, 13, ...]
def fibbo(n):
match n:
case 0 | 1:
return n
case _:
return fibbo(n-1) + fibbo(n-2)
# For example: the first few items in the sequence:
for n in range(36):
print(n, fibbo(n))
# A (nowadays) less commonly used way to construct the mapping
# from n to fibbo(n) is to use the map function.
# map returns a generator, and we call list to collect the numbers:
sequence = list(map(fibbo, range(36)))
print(sequence)
# To split the work between multiple Python processes, we can
# use the multiprocessing module:
import multiprocessing
pool = multiprocessing.Pool()
sequence = pool.map(fibbo, range(36))
print(sequence)
# We may use 'with' to clean up the pool after we're done with
# the workers:
with multiprocessing.Pool(10) as pool:
sequence = pool.map(fibbo, range(36))
print(sequence)

10
exercises/exerciseC/run_with_all_configurations.sh Normal file → Executable file
View file

@ -1,9 +1,13 @@
# This is bash #!/bin/bash
# It runs the python script multiple times with different arguments set -ex
# This is a bash script.
# It runs the python program multiple times with different arguments.
for i in {1..5} # Number of processes for i in {1..5} # Number of processes
do do
for j in {1..5} # Number of threads for j in {1..5} # Number of threads
do do
python process_images.py $i $j images/* python process_images.py $i $j images/*
done done
done done

View file

@ -0,0 +1 @@
../exercises/exerciseB/map_example_codealong.py