2012-05-20 2 views
8

Имеет ли значение, где модули загружаются в код? Или все они должны быть объявлены сверху, так как во время загрузки внешние модули должны загружаться независимо от того, где они объявлены в коде ...?Python: Оптимизация импорта

Пример:

from os import popen 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    import logging     #Module called only when needed? 
    logging.exception("Record to logger) 

или это оптимизирована компилятором так же, как:

from os import popen 
import logging      #Module will always loaded regardless 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    logging.exception("Record to logger) 

ответ

10

This указывает, что это может сделать разницу:

«операторы импорта может быть выполнена примерно в любом месте. Часто бывает полезно разместить их внутри функций, чтобы ограничить их видимость и/или уменьшить начальное время запуска. Хотя интерпретатор Python оптимизирован не импортировать тот же модуль несколько раз, повторного выполнения оператор импорта может серьезно повлиять на производительность в некоторых обстоятельствах

Эти два вопроса ОС, local import statements? и import always at top of module? обсудить это на расстоянии.

Наконец, если вам интересно о вашем конкретном случае вы могли бы профиль/Benchmark ваши две альтернативы в вашей среде.

Я предпочитаю ставить все мои заявления на импорт в верхней части исходного файла, после Stylis tic conventions и для согласованности (также это облегчило бы изменения позже, не имея необходимости искать исходный файл, ищущий заявления импорта, разбросанные повсюду)

+0

Все еще немного смущен. Похоже, загрузчик НЕОБХОДИМО загружать внешний модуль, на всякий случай вызывается исключение? Единственные издержки, которые я вижу, - это всего лишь одна дополнительная строка кода в исключении. – tetris11

+1

Просто напишите в своем коде, сделайте импорт в верхней части файла. –

+0

@JakobBowyer Но в чем разница, с точки зрения производительности - это то, что я действительно спрашиваю – tetris11

2

Общее эмпирическое правило состоит в том, что импорт должен находиться в верхней части файла , так как это упрощает выполнение кода, и это упрощает определение того, какой модуль понадобится без необходимости проходить через весь код.

Питон стиль руководства охватывает некоторые основные принципы для того, как импорт должен выглядеть: http://www.python.org/dev/peps/pep-0008/#imports

На практике, однако, бывают случаи, когда это имеет смысл импортировать внутри той или иной функции. Это приходит с импортом, что бы круговое:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
from module1 import A 

class B(object): 
    def do_something(self): 
     my_a = A() 
     ... 

Это не будет работать, как есть, но вы могли бы получить вокруг округлости путем перемещения импорта:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
class B(object): 
    def do_something(self): 
     from module1 import A 
     my_a = A() 
     ... 

В идеале, вы бы МОДЕЛИРОВКИ классы, чтобы это никогда не появлялось и, возможно, даже включало их в один и тот же модуль. В этом примере игрушек, имея каждый импорт, другой действительно не имеет смысла. Однако на практике есть некоторые случаи, когда имеет смысл включать импорт для одного метода внутри самого метода, а не бросать все в один и тот же модуль или извлекать рассматриваемый метод для какого-либо другого объекта.

Но, если у вас нет веских оснований для отклонения, я говорю, что соглашаюсь с соглашением о верхнем плане.

Смежные вопросы