4 votes

La longueur du nom d'une variable affecte-t-elle la vitesse d'exécution du programme ?

J'ai un petit bout de code qui doit fonctionner pendant un long moment. Je me demande si la longueur des noms de variables que j'utilise peut modifier la vitesse d'exécution du programme. Voici un exemple très simple écrit en Python.

Programme A

    x = 1
    while not x == 0:
          print('message')

Programme B

    xyz = 1
    while not xyz == 0:
          print('message')

Le programme A imprimera-t-il le message plus souvent que le programme B si j'exécute le programme A et le programme B pendant 30 ans sur deux machines identiques.

8voto

chepner Points 54078

Non, les noms eux-mêmes n'ont aucun effet sur la rapidité d'exécution du code résultant. Les noms de variables sont simplement utilisés pour distinguer dans le source Python deux variables qui sont représentées par des indices entiers dans une table de consultation :

>>> dis.dis('x=1')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (None)
              6 RETURN_VALUE
>>> dis.dis('xyz=1')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (xyz)
              4 LOAD_CONST               1 (None)
              6 RETURN_VALUE
>>> dis.dis('x=1;xyz=2;')
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (2)
              6 STORE_NAME               1 (xyz)
              8 LOAD_CONST               2 (None)
             10 RETURN_VALUE

Dans les deux premiers, vous remarquerez qu'aucune distinction basée sur le nom de la variable n'est faite dans le code octet résultant. Dans la dernière, vous verrez que le code d'octet fait la différence entre les deux, mais seulement sur l'ordre dans lequel ils sont définis, pas sur la longueur de l'étiquette.

1voto

C-3PO Points 310

Les résultats mentionnés par @chepner sont corrects, Python peut prendre plus de temps pour exécuter le code dans la console, mais une fois le code compilé, les résultats sont les mêmes.

Pour m'assurer que c'est correct, j'ai créé le code suivant, également inspiré par la réponse de @knifer :

from time import time
from numpy import average,std

x                                              = 1
xyzabcdexyzabcdefghidjakeldkjlkfghidjakeldkjlk = 1

short_runs = 0
long_runs  = 0

for _ in range(int(2e7)):

    t0 = time()
    if x:
        pass
    short_runs += time() - t0

    t0 = time()
    if xyzabcdexyzabcdefghidjakeldkjlkfghidjakeldkjlk:
        pass
    long_runs  += time() - t0

print('Runtime results:')
print(f"Small variable runs : (sum = {short_runs:.3f})")
print(f"Long  variable runs : (sum = {long_runs :.3f})")

Le code que je propose est quelque peu différent, dans le sens où les essais pour les noms de variables longs et courts sont entrelacés, de sorte que toute différence causée par les processus OS sous-jacents est minimisée.

Les résultats du code varient selon que vous copy-paste le code dans une console Python, ou vous appelez le code en tant que programme ( python trial_runs.py ). Exécution avec copy-paste ont tendance à être plus lents en utilisant des noms de variables longs, alors que l'appel du code en tant que programme donne des temps d'exécution identiques.

PS. Les temps de fonctionnement réels changent tout le temps pour moi (dans un sens ou dans l'autre), il est donc difficile de rapporter des valeurs exactes. Même les longs noms de variables peuvent parfois s'exécuter plus rapidement, bien que cela soit très rare sur la console Python. La conclusion la plus importante est que les différences sont très faibles dans les deux cas :)

-1voto

knifer Points 11

La différence est très faible et nous ne pouvons pas conclure que c'est à cause du nom de la variable.

import timeit
x=1
xyz=1

start_time = timeit.default_timer()
for i in range(1,1000000):
    if x==1:
        print("message")
elapsed = timeit.default_timer() - start_time

start_time2 = timeit.default_timer()
for i in range(1,1000000):
    if xyz==1:
        print("message")

elapsed2 = timeit.default_timer() - start_time2

print("small variable printing = ",str(elapsed),"big variable printing = "+str(elapsed2))

Et le résultat était :

small variable printing =  3.6490847053481588 big variable printing = 3.7199463989460435

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X