Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python导入语句的位置是否影响性能_Python - Fatal编程技术网

python导入语句的位置是否影响性能

python导入语句的位置是否影响性能,python,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 f

我想知道导入语句在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()会对性能产生不利影响吗?我的所有导入都应该放在顶部,还是只在第一次调用函数时才进行导入

导入有两件事:

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

  • 将当前命名空间中的名称绑定到导入的对象
    import foo
    设置名称
    foo
    <代码>来自foo导入栏绑定名称
    ,等等

  • 现在,本地名称(在函数中)具有速度优势,因为Python将它们存储在C数组中,并使用字节码中的索引来引用它们。全局名称存储在字典中,每次查找时都会有少量哈希开销

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

    但是,只有在关键路径上使用了大量执行的代码时,才应该进行这种优化。通过在函数中隐藏导入,您需要付出维护成本,并且需要根据(边际)速度效益权衡该成本。

    导入有两个作用:

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

  • 将当前命名空间中的名称绑定到导入的对象
    import foo
    设置名称
    foo
    <代码>来自foo导入栏绑定名称
    ,等等

  • 现在,本地名称(在函数中)具有速度优势,因为Python将它们存储在C数组中,并使用字节码中的索引来引用它们。全局名称存储在字典中,每次查找时都会有少量哈希开销

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


    但是,只有在关键路径上使用了大量执行的代码时,才应该进行这种优化。通过将导入隐藏在函数中,您付出了维护代价,需要将该成本与(边际)速度效益进行权衡。

    为了可读性,最好将所有导入放在顶部,但如果您有一个需要导入的函数,并且该函数可能不会被调用,把它放在函数中不会有什么坏处你的示例代码中没有
    function1
    。@Padraiccanningham不管它是否会成为瓶颈,我仍然想知道这可以提供一个答案:--这可以提供一个解释:他们回答你的可读性问题,最好将所有导入放在首位,但是如果您有一个需要导入的函数,并且该函数可能不会被调用,把它放在函数中不会有什么坏处您的示例代码中没有
    function1
    。@Padraiccanningham不管它是否会成为瓶颈,我仍然想知道这可以提供一个答案:--这可以提供一个解释:他们回答了您的问题