Donc j'écris une fonction qui prend un tuple en argument et fait plein de trucs dessus. Voici ce qui ressemble à:Python charge-t-il des arguments de fonction dans des registres ou les conserve-t-il dans la pile?
def swap(self, location):
if (location[0] < 0 or location[1] < 0 or
location[0] >= self.r or location[1] >= self.c):
return False
self.board[0][0] = self.board[location[0]][location[1]]
self.board[location[0]][location[1]] = 0
self.empty = (location[0],location[1])
Je suis en train de faire mon code aussi efficace que possible, de sorte que je ne suis pas modifier les valeurs de location
, est-il logique de charger les variables dans les registres (loc0 = location[0]; loc1 = location[1]
) pour des calculs plus rapides (lecture à cycle nul) ou location
est-il déjà chargé dans les registres par le compilateur Python lorsqu'il est passé en argument de fonction?
Modifier: J'ai mordu la balle et j'ai fait quelques tests. Voici les résultats (en quelques secondes) pour cette fonction en cours d'exécution 10 millions de fois avec les entrées répétitives: "up", "down", "left", "right"
(respectivement)
Code as is:
run#1: 19.39
run#2: 17.18
run#3: 16.85
run#4: 16.90
run#5: 16.74
run#6: 16.76
run#7: 16.94
Code after defining location[0] and location[1] in the beginning of the function:
run#1: 14.83
run#2: 14.79
run#3: 14.88
run#4: 15.033
run#5: 14.77
run#6: 14.94
run#7: 14.67
C'est une moyenne de 16% d'augmentation des performances. Certainement pas insignifiant pour mon cas. Bien sûr, ce n'est pas scientifique car j'ai besoin de faire plus de tests dans plus d'environnements avec plus d'entrées, mais assez pour mon cas d'utilisation simple!
Les temps mesurés en utilisant Python 2.7 sur un Macbook Pro (Early 2015), qui a un Broadwell i5-5257U CPU (2c4t max turbo 3.1GHz, 2.7GHz soutenu, 3 Mo de cache L3). IDE était: PyCharm Edu 3.5.1 JRE: 1.8.0_112-version-408-b6 x86_64 JVM: machine virtuelle serveur OpenJDK 64 bits.
Malheureusement, ceci est pour une classe qui se base sur la vitesse du code.
Si vous faites 'loc0 = location [0]', vous définissez une variable, pas un "registre". – BrenBarn
Quel compilateur JIT python utilisez-vous? Si vous utilisez un interpréteur, il est peu probable que les variables Python vivent dans des registres entre différentes expressions. En C, un avantage de l'utilisation de variables locales est quand il y a un alias possible. (par exemple si le compilateur pense modifier self.board [0] [0] pourrait avoir aussi modifié l'emplacement [0], le lire dans un local laisserait le compilateur le garder dans un registre.) IDK si c'est quelque chose en Python. (Je suis ici à cause de la balise [tag: assembly].) –
@BrenBarn Oui, mais les compilateurs optimisent les variables définies qui sont fréquemment utilisées en leur allouant des registres. – QuantumHoneybees