2016-09-10 6 views
0

Мне было интересно, влияет ли положение операторов импорта в программе python на производительность. Например, если у меня есть этаЯвляется ли позиция операторов импорта python влиять на производительность

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import urllib2 
import json 
import requests 
from flask import render_template, request, Flask, session, Markup, jsonify, send_from_directory 
from wit import Wit 
from os import urandom 
from datetime import datetime 
from uuid import uuid1 
from random import choice 
from FAAWrapper import FAA_API 
from bs4 import BeautifulSoup 



def function1(): 
    from OpenSSL import SSL 
    from fuzzywuzzy import process 
    continue 

def function2(): 
    continue 

производительность отрицательно скажется на вызове function1() в том, что function1 содержит операторы импорта? Должен ли весь мой импорт размещаться наверху или происходит импорт только после первого вызова функции?

+0

Для удобства чтения лучше всего разместить весь импорт вверху, но если у вас есть функция, которая нуждается в импорте, и эта функция не может быть вызвана, это не помешает включить ее в функцию –

+0

У вас нет функции function1 'в вашем примере кода. –

+0

@PadraicCunningham Независимо от того, будет ли это узким местом, я все еще хотел бы знать – user3282276

ответ

6

Импортирование делает две вещей:

  1. Если нет sys.modules записи еще, найти и загрузить модуль; если код Python, выполняющий код верхнего уровня, создает пространство имен для этого модуля. Этот шаг пропускается, если модуль уже загружен.

  2. Связать имя в текущем пространстве имен с импортированным объектом. import foo устанавливает имя foo. from foo import bar связывает имя bar и т.д.

Теперь местных имен (в функции) имеют преимущество в скорости в том, что Python сохраняет эти данные в массиве C и использует индексы в байткоде для ссылки на них. Глобальные имена хранятся в словаре и имеют небольшой объем хеширования при каждом поиске.

Так что импорт чего-то в функцию приводит к локальному доступу, который быстрее, чем ссылка на глобальную. Это компенсируется поиском хэша в sys.modules каждый раз, когда ваша функция работает так, только если имя используется в цикле, вы заметили бы это.

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