Jaký je optimální způsob, jak používat globální proměnné?

0

Otázka

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 constantkoncept , 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í?

global-variables python
2021-11-22 18:13:13
1

Nejlepší odpověď

1
def fglobal2():
    global_number = number # single access to global
    for i in range(25):
        x = global_number

je tak rychle, jak místní na mém stroji (jsem běžet 10x více testů pro méně šumu na odhad času)

local: 4.409
global: 4.914
global2: 4.406  # proposed, as fast as local
closure: 4.560
2021-11-22 18:19:05

přidání trochu více detailů (což tato odpověď neznamená, objasnění), ale jediný rozdíl mezi touto verzí a 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 funkci locals(),, 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ít global_number. Doufám, že to pomůže.
rv.kvetch

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................