Es wurde darauf hingewiesen, dass "local ()" nicht normal in einer Funktion verwendet werden kann (das offizielle Dokument besagt sogar, dass es nicht verwendet werden sollte). Seien Sie vorsichtig, wenn Sie es verwenden.
Ich glaube nicht, dass es viele gibt, aber es gibt Zeiten, in denen Sie Variablennamen dynamisch festlegen möchten, und manchmal auch nicht. Deshalb habe ich versucht, herauszufinden, wie das geht. (Wenn Sie beispielsweise Daten aus einer externen Datei lesen und den Dateinamen als Variablennamen verwenden möchten?)
Ich habe 2 (+ α) Wege gefunden, daher möchte ich als Einführung die Geschwindigkeiten vergleichen.
Regel
-Messen mit dem Befehl %% timeit
auf dem Jupyter Notebook.
** Vorbereitung ** Bereiten Sie Variablennamen im Voraus vor, um die Messung nicht zu beeinträchtigen.
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)]
exec ()
Die gebräuchlichste Methode.
%%timeit
for i in range(1000):
exec(f'{names[i]} = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]')
Ergebnis
20.7 ms ± 75.7 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
local ()
und globals ()
werden als lokale Variablen und Wörterbücher erkannt, die globale Variablen verwalten (es tut mir leid, wenn sie unterschiedlich sind).
Wie beim normalen Wörterbuchtyp können Sie den Indexer oder .get ()
verwenden, um den Wert abzurufen, und .update ()
zum Aktualisieren verwenden.
%%timeit
for i in range(1000):
locals().update({f'{names[i]}':[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]})
Ergebnis
386 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Ändern Sie die Methode ein wenig
%%timeit
for i in range(1000):
locals()[names[i]] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Ergebnis
248 µs ± 387 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Mit dem exec ()
Verhältnis,
・ Exec ()
: 1x
・ Locals (). Update ()
: ** 53 mal **
・ Locals () []
: *** 83 mal ***
Ich konnte es so schnell wie möglich definieren.
** Fazit **