Je découvre un peu le cProfiler de python et je découvre une chose qui va à l'encontre des principes que j'avais souvent lu jusqu'à là concernant l'optimisation.

En l'occurrence, l'utilisation d'une boucle dans le calcul d'une somme (pour le calcul d'un coefficient du carré d'une matrice) est plus efficace que la fonction sum.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def somme(l, i, j):
    """Moins efficace qu'on pourrait le croire"""
    return sum([l[i][k]*l[k][j] for k in range(len(l))])
 
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   199584    2.000    0.000    2.000    0.000 modnoter.py:18(<listcomp>)
   199584    0.282    0.000    2.447    0.000 modnoter.py:16(somme)
   202032    0.149    0.000    0.149    0.000 {built-in method sum}
 
def somme(l, i, j):
    """Sans l'utilisation d'une liste, c'est encore plus long !"""
    return sum(l[i][k]*l[k][j] for k in range(len(l)))
 
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
  7384608    2.453    0.000    2.453    0.000 modnoter.py:18(<genexpr>)
   202032    0.863    0.000    3.316    0.000 {built-in method sum}
   199584    0.202    0.000    3.534    0.000 modnoter.py:16(somme)
 
#Finalement, la bonne méthode
def somme(l, i, j):
    """somme pour le calcul d'un produit de matrice"""
    s = 0
    for k in range(len(l)):
        s += l[i][k] * l[k][j]
    return s
 
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   199584    1.930    0.000    1.945    0.000 modnoter.py:9(somme)
Qu'en pensez-vous ?
(Je suis sur Python 3, sous linux)