Skutečnost, že global
proměnné v python
jsou pomalejší než local
ty je docela dobře známo, a bylo již popsáno v různé otázky v této lokalitě. Nicméně, jedna věc, kterou jsem stále nenašel odpověď, je, jaká je nejlepší a nejrychlejší způsob, jak používat global
proměnné (jako constant
koncept , který neexistuje v pythonu), které jsou používány uvnitř různých funkcí v kódu?
Nejlepší řešení jsem našel tak daleko je definovat closure
funkce kde jsem přiřadit globální proměnné lokální.
from timeit import timeit
number = 10
def flocal():
number = 10
for i in range(25):
x = number
def fglobal():
for i in range(25):
x = number
def fglobal_wrapper():
global_number = number
def actual_func():
for i in range(25):
x = global_number
return actual_func
fclosure = fglobal_wrapper()
print("local: %.3f" % timeit("flocal()", "from __main__ import flocal"))
print("global: %.3f" % timeit("fglobal()", "from __main__ import fglobal"))
print("closure: %.3f" % timeit("fclosure()", "from __main__ import fclosure"))
Výstup:
local: 0.681
global: 0.806
closure: 0.728
Ale to je ošklivé řešení, a to je ještě pomalejší než pomocí lokální proměnné. Co je nejlepší známý způsob použít globální/konstantní proměnnou ekvivalentní uvnitř funkce, aniž byste museli používat je předat jako argumenty funkce, nebo toto closure
řešení?
fglobal_wrapper
je to původní verze vytvoří a vrátí nový func; od global_number je vlastně v uzavření jako protiklad ve funkci místní obyvatelé v tom případě, že běží pomaleji, v timeit. V tomto přístupu, global_number je výslovně ve funkcilocals()
,, takže to běží trochu rychleji, protože python už to najde, když to kontroluje funkci místní, takže to není potřeba kontrolovat další obory, jako jsou uzávěry a globals najítglobal_number
. Doufám, že to pomůže.