【问题标题】:Does the position of python import statements affect performancepython import语句的位置是否影响性能
【发布时间】:2016-09-10 22:32:24
【问题描述】:

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

【问题讨论】:

标签: python


【解决方案1】:

导入做了两件事

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

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

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

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

但是,只有在关键路径上使用该代码时,您才应该进行此类优化,代码执行次数非常多。您通过在函数中隐藏导入来支付维护成本,并且需要权衡成本与(边际)速度收益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2012-10-05
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多