/ / Różnica między importowaniem biblioteki python w funkcji a importowaniem globalnym? - python, python-3.x, python-import

Różnica między importowaniem biblioteki python w funkcji a importowaniem globalnie? - python, python-3.x, python-import

Załóżmy, że chcę zaimportować bibliotekę Pythona do użycia wewnątrz funkcji. Czy lepiej importować bibliotekę w ramach funkcji lub importować ją globalnie?

Zrób to

def test_func:
import pandas as pd
# code implementation

lub czy linia poniżej na górze pliku Pythona ma być importowana globalnie?

import pandas as pd

Jakie są plusy i minusy każdego podejścia? Która z najlepszych praktyk jest dostępna w pythonie?

Używam Pythona v3.6

EDYCJA: Kilka wyjaśnień do zrobienia.

Załóżmy, że mam 2 funkcje.

def func1:
import pandas as pd
# code implementation

def func2:
import pandas as pd
# code implementation

Skrypt Pythona uruchamia obie funkcje. Czy biblioteka zostanie zaimportowana dwukrotnie lub czy kompilator Pythona jest wystarczająco inteligentny, aby zaimportować go tylko raz? Ma to wpływ na wydajność.

Odpowiedzi:

3 dla odpowiedzi № 1

Różnica w widoczności nazwy iczas realizacji. Import na poziomie modułu jest importowany, gdy ładowany plik jest importowany lub uruchamiany sam. Funkcja lokalna oczywiście tylko wtedy, gdy funkcja jest uruchomiona. Zaimportowane nazwy są widoczne dla wszystkich elementów w pliku lub tylko wewnątrz funkcji, w której import jest wykonywany.

Ponieważ istnieje koszt trafienia w deklarację importu (choć niewielki, ale nadal), lokalny zawsze wykonać, nie tylko raz. Jednak nie zostanie w pełni ponownie zaimportowany moduł, Python buforuje moduły po ich zaimportowaniu za pierwszym razem (zob reload i sys.modules).

Najlepszą praktyką jest wykorzystanie poziomu modułuimportuje, i to jest to, co widzisz w 99,999% kodu. Ogromnym powodem jest łatwość utrzymania - jeśli chcesz zrozumieć, jakie zależności ma moduł, wygodnie jest po prostu spojrzeć na górę, zamiast przeczesywać wszystkie kod.

Kiedy więc skorzystać z funkcji lokalnego importu?

Istnieją trzy scenariusze:

  • nie można wcześniej zaimportować, co dzieje się, gdy np. w środowisku wykonawczym wybrano backend dla db lub innego systemu / funkcjonalności podczas konfiguracji lub inspekcji systemu.

  • w przeciwnym razie masz import cykliczny. Jest to rzadki przypadek, a także zapach kodu, więc jeśli to konieczne, rozważ refaktoryzację.

  • skrócenie czasu uruchamiania poprzez opóźnienie importu modułów. Jest to jednak bardzo rzadko przydatne.

Tak więc w twoim przypadku odpowiedź jest szybka i prosta "nie rób tego".


1 dla odpowiedzi nr 2

Moduł zostanie załadowany po zaimportowaniu, więc jeśli chcesz zaimportować rzadko używany moduł, ale kosztuje dużo czasu na zainicjowanie, powinieneś go zaimportować, kiedy go potrzebujesz.

Właściwie, jeśli zależy nam tylko na wydajności, ale nie na czytelności, zawsze lepiej jest importować moduł, kiedy naprawdę go potrzebujemy.

Ale musimy utrzymać nasz program do utrzymania. Importowanie wszystkich modułów na górze jest najbardziej wyraźnym sposobem poinformowania innych autorów, którzy moduły są używane.

Podsumowując, jeśli naprawdę masz bardzo kosztowny, ale rzadko używany moduł, powinieneś go zaimportować lokalnie. W przeciwnym razie należy je zaimportować na górze.