Il a été souligné que «locaux ()» ne peut pas être utilisé normalement dans une fonction (le document officiel précise même qu'il ne doit pas être utilisé). Soyez prudent lorsque vous l'utilisez.
Je ne pense pas qu'il y en ait beaucoup, mais il y a des moments où vous voulez définir des noms de variables de manière dynamique, et parfois vous ne le faites pas, alors j'ai essayé de savoir comment faire cela. (Par exemple, si vous souhaitez lire des données à partir d'un fichier externe et utiliser le nom de fichier comme nom de variable?)
J'ai trouvé 2 (+ α) façons, donc j'aimerais comparer les vitesses en guise d'introduction.
règle
-Mesuré à l'aide de la commande %% timeit
sur le bloc-notes Jupyter.
-Utilisez 5 caractères d'alphabet inférieur aléatoires comme nom de variable.
-Substituer une liste contenant des entiers de 0 à 9 comme valeurs.
・ Mesurez la moyenne de 1000 boucles.
** Préparation ** Préparez à l'avance les noms des variables afin de ne pas affecter la mesure.
import random
chrs = [chr(i) for i in range(ord('a'), ord('z')+1)]
names = [''.join(random.sample(chrs, 10)) for i in range(10)]
La méthode la plus courante.
%%timeit
for i in range(1000):
exec(f'{names[i]} = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]')
résultat
20.7 ms ± 75.7 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
locals ()
ou globals ()
locals ()
et globals ()
sont reconnus comme des variables locales et des dictionnaires qui gèrent respectivement les variables globales (je suis désolé si elles sont différentes).
Comme avec le type de dictionnaire normal, vous pouvez utiliser l'indexeur ou .get ()
pour obtenir la valeur, et utiliser .update ()
pour mettre à jour.
%%timeit
for i in range(1000):
locals().update({f'{names[i]}':[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]})
résultat
386 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Changer un peu la méthode
%%timeit
for i in range(1000):
locals()[names[i]] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
résultat
248 µs ± 387 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Rapport ʻExec () , ・ ʻExec ()
: 1x
・ Locals (). Update ()
: ** 53 fois **
・ Locals () []
: *** 83 fois ***
J'ai pu le définir le plus rapidement possible.
** Conclusion **
Recommended Posts