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

"""
Explanation: 1A.soft - Exemple de profiling
Profiling 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 est plus lente qu'une réimplémentation simple qui fait à la même chose.
End of explanation
"""


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)

"""
Explanation: Que se passe-t-il ?
Tout d'abord la fonction pdf 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
End of explanation
"""


