<jupyter_start><jupyter_text>1A.soft - Exemple de profilingProfiling et fonction *pdf*. Le profiling est utilisé pour mesurer le temps que passe un programme dans chaque fonction.  Bizarrerie C'est un exemple qui m'a été envoyé par un étudiant pendant l'été pour montrer que la fonction [pdf](http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.norm.html) est plus lente qu'une réimplémentation simple qui fait à la même chose.<jupyter_code>import time
from scipy.stats import norm
import numpy as np
debut=time.time()
for i in range(10**3):
    norm(2,3).pdf(4)
fin=time.time()
fin-debut
def density(x,mean,sigma2):
    return np.exp(-(x-mean)**2/(2*sigma2))/(2*np.pi*sigma2)**0.5

debut=time.time()
for i in range(10**3):
    density(4,2,3)
fin=time.time()
fin-debut<jupyter_output><empty_output><jupyter_text>**Que se passe-t-il ?**Tout d'abord la fonction [pdf](http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.norm.html) comme toute les fonctions des librairies numériques sont optimisées pour le calcul sur des matrices ou des vecteurs et non sur des nombres. Pour la suite, on utilise un profileur.  Profiler<jupyter_code>import cProfile, io, pstats, os, sys
def doprofile(func, filename, *l):
    pr = cProfile.Profile()
    pr.enable()  # début du profiling
    func(*l)     # appel de la fonction                
    pr.disable() # fin du profiling
    s = io.StringIO()
    ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
    ps.print_stats()
    rem = os.path.normpath(os.path.join(os.getcwd(), "..", "..", ".."))
    res = s.getvalue().replace(rem, "")
    res = res.replace(sys.base_prefix, "").replace("\\", "/")
    ps.dump_stats(filename)
    return res
import numpy
x = numpy.ones((10000000, 1))*4
x.shape
debut=time.time()
y = norm.pdf(x)
fin=time.time()
print(fin-debut, y.shape, y[0])
r = doprofile(norm.pdf, "pdf.prof", x)
print(r)
def density(x,mean,sigma2):
    return np.exp(-(x-mean)**2/(2*sigma2))/(2*np.pi*sigma2)**0.5

debut=time.time()
y = density(x,0.0,1.0)
fin=time.time()
print(fin-debut, y.shape, y[0])
r = doprofile(density, "pdf.prof", x, 0, 1)
print(r)<jupyter_output>2 function calls in 0.341 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.341    0.341    0.341    0.341 <ipython-input-15-e74f743d975f>:1(density)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
{'fraction_non_alphanumeric': 0.15220024222850223, 'fraction_numerical': 0.04238998788857489, 'mean_word_length': 3.906930693069307, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '474169', 'license': 'MIT', 'n_tokens_mistral': 984, 'n_tokens_neox': 938, 'n_words': 227, 'path': '_doc/notebooks/1a/profiling_example.ipynb', 'repo_name': 'Jerome-maker/ensae_teaching_cs', 'size': '2477'}