2011-10-04 10 views
7

Używam strony internetowej używającej Django i importuję plik ipdb na początku prawie wszystkich moich skryptów, aby ułatwić debugowanie. Jednak przez większość czasu nigdy nie używam funkcji z modułu (tylko podczas debugowania).Czy importowanie modułu (ale nie używanie go) zmniejsza wydajność w Pythonie?

Zastanawiasz się, czy to zmniejszy moje wyniki? Tyle, że gdy chcę utworzyć przerwania Wolę napisać:

ipdb.set_trace() 

w przeciwieństwie do:

import ipdb; ipdb.set_trace() 

Ale widziałem drugiego przykładu zrobić w kilku miejscach, co sprawia, że ​​zastanawiam się jeśli jest bardziej wydajny ...

Po prostu nie wiem, w jaki sposób importowanie modułów Pythona wiąże się z wydajnością (zakładając, że nie używasz metod modułu w swoim skrypcie).

Odpowiedz

4

Jak wspomniano @wRAR, Ładowanie modułu może wymagać wykonania dowolnej ilości kodu, która może zająć dowolną ilość czasu. Z drugiej strony moduł zostanie załadowany tylko jeden raz i każda kolejna próba importu znajdzie moduł obecny w os.sys.modules i odniesienie do niego.

W środowisku Django w trybie debugowania moduły są usuwane z Django z AppCache i są ponownie importowane tylko wtedy, gdy są zmieniane, co prawdopodobnie nie będzie możliwe z ipdb, więc w twoim przypadku nie powinno to stanowić problemu.

Jednak w niektórych przypadkach byłby to problem, istnieją pewne sposoby obejścia tego problemu.Załóżmy, że masz moduł niestandardowy, który służy do i tak ładować, można dodać funkcję do niej, że przywóz ipdb tylko wtedy, gdy wymagają tego:

# much used module: mymodule 
def set_trace(): 
    import ipdb 
    ipdb.set_trace() 

w module, który chcesz użyć ipdb.set_trace:

import mymodule 

mymodule.set_trace() 

lub na górze modułu, użyj krzyża moduł __debug__ zmiennej:

if __debug__: 
    from ipdp import set_trace 
else: 
    def set_trace(): return 
+0

Czy importowanie modułu (ale nie używanie go) zmniejsza wydajność w Pythonie? To jest pytanie – joaquin

+1

Rzeczywiście @joaquin, byłem już w trakcie mojej edycji powyżej, kiedy napisałeś swój komentarz;). Niektórzy mogą się z tym nie zgodzić, ale jest to również świetne miejsce, aby udzielić porady dotyczącej rozwiązywania problemów zainteresowanym tym pytaniem. – Remi

+0

Dzięki! Doceniałem praktyczne przykłady. =) –

2

Krótka odpowiedź: Nie jest zwykle

odpowiedź Long:

To zajmie trochę czasu, aby załadować moduł. Może to być zauważalne, jeśli ładujesz python z dysku sieciowego lub innego wolnego źródła. Ale jeśli będziesz działać bezpośrednio z dysku twardego, nigdy tego nie zauważysz.

Jak zaznacza @wRar, zaimportowanie modułu może wykonać dowolną ilość kodu. Możesz mieć dowolny kod, który chcesz wykonać podczas uruchamiania modułu. Jednak większość modułów unika wykonywania nieuzasadnionych ilości kodu podczas uruchamiania. Więc to prawdopodobnie nie jest ogromna przyczyna.

Jednak importowanie bardzo dużych modułów, szczególnie tych, które również powodują importowanie dużej liczby modułów c, zajmie trochę czasu.

Tak więc importowanie zajmie trochę czasu, ale tylko raz na moduł zostanie zaimportowany. Jeśli importujesz moduły u góry modułów (w przeciwieństwie do funkcji), to ma to zastosowanie tylko do czasu uruchamiania. Zasadniczo, nie unikniesz zbyt wielu optymalizacji, aby uniknąć importowania modułów.

+0

@JBernardo: Masz rację, zauważyłem to, a 'scipy' jest jeszcze wolniejsza, więc zwykle importuję jedynie funkcje, których aktualnie używam (' od scipy import foo, bar, spam') – heltonbiker

+1

Ładowanie moduł może wymagać wykonania dowolnej ilości kodu, która może zająć dowolną ilość czasu. – wRAR

+0

@WRAR, masz rację. –

0

Importowanie moduł, ale nie jest używany decre azy (system) wydajność:

  1. Potrzeba czasu, aby zaimportować moduł
  2. Importowane moduły używać pamięć

ile pierwszy punkt sprawia, że ​​Twój program wolniej, aby rozpocząć drugi punkt może zrobić WSZYSTKIE twoje programy wolniej, w zależności od całkowitej ilości pamięci w systemie.

Powiązane problemy