For simplicity, we only include the script for the improved algorithm. For the
intuitive algorithm, simply replace the algorithm. The imports timing and memory
usage tracking code are nearly identical.

\begin{lstlisting}[language=python]
#!/usr/bin/python3
import tracemalloc
from random import random
from math import floor, sqrt
#from statistics import mean, variance
from time import perf_counter

# starting the memory monitoring
tracemalloc.start()

start_time = perf_counter()

# store memory consumption before
current_before, peak_before = tracemalloc.get_traced_memory()

# algorithm (part to replace)
N = 10**6
Tot = 0
Tot2 = 0
for _ in range(N):
    item = random()
    Tot  += item
    Tot2 += item ** 2
mean = Tot / N
variance = Tot2 / (N-1) - mean**2

# store memory after
current_after, peak_after = tracemalloc.get_traced_memory()

end_time = perf_counter()

print("mean     :", mean)
print("variance :", variance)

# displaying the memory usage
print("Used memory before : {} B (current), {} B (peak)".format(current_before,peak_before))
print("Used memory after : {} B (current), {} B (peak)".format(current_after,peak_after))
print("Used memory : {} B".format(peak_after - current_before))
print("Time : {} ms".format((end_time - start_time) * 1000))

tracemalloc.stop()
\end{lstlisting}

Example output:
\begin{lstlisting}[language=python]
mean     : 0.5002592040785124
variance : 0.0833757719902084
Used memory before : 0 B (current), 0 B (peak)
Used memory after : 1308 B (current), 1336 B (peak)
Used memory : 1336 B
Time : 535.1873079998768 ms
\end{lstlisting}
