我想知道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语句?我的所有导入应该放在顶部还是仅在第一次调用函数时才导入导入?
答案 0 :(得分:6)
导入两个事物:
如果还没有sys.modules
条目,请查找并加载模块;如果Python代码,执行顶级代码会产生该模块的命名空间。如果已加载模块,则跳过此步骤。
将当前名称空间中的名称绑定到导入的对象。 import foo
设置名称foo
。 from foo import bar
绑定名称bar
等
现在,本地名称(在函数中)具有速度优势,因为Python将这些存储在C数组中,并使用字节码中的索引来引用它们。 全局名称存储在字典中,每次执行查找时都会产生小的散列开销。
因此,将某些内容导入函数会导致本地访问,这比引用全局更快。每次函数运行时,sys.modules
中的哈希查找都会抵消这一点,所以只有在循环中使用该名称时才会注意到这一点。
但是,如果代码在关键路径上使用,那么您应该只进行这样的优化。您通过隐藏函数中的导入来支付维护价格,并且该成本需要与(边际)速度优势进行权衡。