python import语句的位置是否会影响性能

时间:2016-09-10 22:32:25

标签: python

我想知道python程序中import语句的位置是否对性能有任何影响。例如,如果我有这个

#!/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包含import语句?我的所有导入应该放在顶部还是仅在第一次调用函数时才导入导入?

1 个答案:

答案 0 :(得分:6)

导入两个事物:

  1. 如果还没有sys.modules条目,请查找并加载模块;如果Python代码,执行顶级代码会产生该模块的命名空间。如果已加载模块,则跳过此步骤。

  2. 将当前名称空间中的名称绑定到导入的对象。 import foo设置名称foofrom foo import bar绑定名称bar

  3. 现在,本地名称(在函数中)具有速度优势,因为Python将这些存储在C数组中,并使用字节码中的索引来引用它们。 全局名称存储在字典中,每次执行查找时都会产生小的散列开销。

    因此,将某些内容导入函数会导致本地访问,这比引用全局更快。每次函数运行时,sys.modules中的哈希查找都会抵消这一点,所以只有在循环中使用该名称时才会注意到这一点。

    但是,如果代码在关键路径上使用,那么您应该只进行这样的优化。您通过隐藏函数中的导入来支付维护价格,并且该成本需要与(边际)速度优势进行权衡。