比较:导入语句与 __import__ 函数

2023-12-29

作为问题的后续使用内置的__import__()正常情况下 https://stackoverflow.com/q/46173417/7051394,我进行了一些测试,并得到了令人惊讶的结果。

我在这里比较经典的执行时间import声明,并呼吁__import__内置功能。 为此,我在交互模式下使用以下脚本:

import timeit   

def test(module):    
    t1 = timeit.timeit("import {}".format(module))
    t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
    print("import statement:   ", t1)
    print("__import__ function:", t2)
    print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))

正如在链接的问题中一样,这是导入时的比较sys,以及其他一些标准模块:

>>> test('sys')
import statement:    0.319865173171288
__import__ function: 0.38428380458522987
t(statement) < t(function)

>>> test('math')
import statement:    0.10262547545597034
__import__ function: 0.16307580163101054
t(statement) < t(function)

>>> test('os')
import statement:    0.10251490255312312
__import__ function: 0.16240755669640627
t(statement) < t(function)

>>> test('threading')
import statement:    0.11349136644972191
__import__ function: 0.1673617034957573
t(statement) < t(function)

到目前为止,一切都很好,import__import__()。 这对我来说很有意义,因为正如我在链接的帖子中所写的那样,我发现合乎逻辑的是IMPORT_NAME与相比,指令被优化CALL_FUNCTION,当后者导致调用__import__.

但当涉及到不太标准的模块时,结果就会相反:

>>> test('numpy')
import statement:    0.18907936340054476
__import__ function: 0.15840019037769792
t(statement) > t(function)

>>> test('tkinter')
import statement:    0.3798560809537861
__import__ function: 0.15899962771786136
t(statement) > t(function)

>>> test("pygame")
import statement:    0.6624641952621317
__import__ function: 0.16268579177259568
t(statement) > t(function)

执行时间差异背后的原因是什么? 其真实原因是什么import标准模块上的语句更快? 另一方面,为什么__import__与其他模块一起运行速度更快吗?

使用 Python 3.6 进行测试


timeit衡量总的执行时间,但是第一次导入一个模块,是否通过import or __import__,比后续的慢 - 因为它是唯一实际执行模块初始化的。它必须在文件系统中搜索模块的文件,加载模块的源代码(最慢)或先前创建的字节码(慢但比解析模块快一点).py文件)或共享库(对于C扩展),执行初始化代码,并将模块对象存储在sys.modules。后续导入将跳过所有这些并从中检索模块对象sys.modules.

如果颠倒顺序,结果将会不同:

import timeit   

def test(module):    
    t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
    t1 = timeit.timeit("import {}".format(module))
    print("import statement:   ", t1)
    print("__import__ function:", t2)
    print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))

test('numpy')
import statement:    0.4611093703134608
__import__ function: 1.275512785926014
t(statement) < t(function)

获得无偏差结果的最佳方法是将其导入一次,然后进行计时:

import timeit   

def test(module):    
    exec("import {}".format(module))
    t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
    t1 = timeit.timeit("import {}".format(module))
    print("import statement:   ", t1)
    print("__import__ function:", t2)
    print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))

test('numpy')
import statement:    0.4826306561727307
__import__ function: 0.9192819125911029
t(statement) < t(function)

所以,是的,import总是比__import__.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较:导入语句与 __import__ 函数 的相关文章

  • 嵌套函数中的变量作用域

    有人可以解释为什么以下程序失败 def g f for in range 10 f def main x 10 def f print x x x 1 g f if name main main 带有消息 Traceback most re
  • 如何使用 tkinter 使用网格功能显示不同的图像?

    我想使用显示文件夹中的图像grid 但是当我尝试使用以下代码时 我得到了迭代单个图像的输出 My code def messageWindow win Toplevel path C Users HP Desktop dataset for
  • 使用 keras 澄清 Yolo v3 模型输出

    我将 yolo v3 模型与 keras 一起使用 该网络为我提供了形状如下的输出容器 1 13 13 255 1 26 26 255 1 52 52 255 所以我找到了这个link https www cyberailab com ho
  • Python:由于 OSError 无法安装软件包:[Errno 2] 没有这样的文件或目录

    我尝试使用pip安装sklearn 并且我收到以下错误消息 错误 由于 OSError 无法安装软件包 Errno 2 没有这样的文件或目录 C Users 13434 AppData Local Packages PythonSoftwa
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • 如何使用 Python 在表单中选择选项?

    我想知道如何以格式如下的形式选择选项 td align left td
  • 在 Python 中引发异常的正确方法是什么? [复制]

    这个问题在这里已经有答案了 这是简单的代码 import sys class EmptyArgs StandardError pass if name main The first way to raise an exception if
  • 在 R 中,为什么 sum 与其他方法(例如 cumsum)相比如此慢?

    我正在尝试实现一个需要非常快的函数 主要是因为它一遍又一遍地处理巨大的数据帧 R 总是让我感到困惑 为什么它有时有点慢 而有时又慢得离谱 不幸的是 它从来都不快 不管怎样 我一直认为 如果可能的话 当以某种方式推入 apply sapply
  • 使用张量流导出神经网络的权重

    我使用张量流工具编写了神经网络 一切正常 现在我想导出神经网络的最终权重以制定单一的预测方法 我怎样才能做到这一点 您需要在训练结束时使用以下命令保存模型tf train Saver https www tensorflow org ver
  • numpy 向量化而不是 for 循环

    我用 Python 写了一些代码 运行良好 但速度很慢 我认为是由于 for 循环 我希望可以使用 numpy 命令加速以下操作 让我定义目标 假设我有一个 2D numpy 数组all CMs尺寸row x col 例如考虑一个6x11数
  • 我应该在哪里对对象和字段进行 django 验证?

    我正在创建一个 Django 应用程序 它使用 Django Rest Framework 和普通的 django views 作为用户的入口点 我想对模型的独立字段以及整个对象进行验证 例如 字段 根据正则表达式函数输入的车牌是否正确 与
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • 如何使用 QAbstractTableModel(模型/视图)将数据设置到 QComboBox?

    我希望能够设置itemData of a combobox当使用填充时QAbstractTableModel 但是 我只能从模型返回一个字符串data method 通常 当不使用模型时 可以像这样执行 Set text and data
  • 将整数转换为特定格式的十六进制字符串

    我是 python 新手 有以下问题 我需要将整数转换为 6 个字节的十六进制字符串 例如 281473900746245 gt xFF xFF xBF xDE x16 x05 十六进制字符串的格式很重要 int 值的长度是可变的 格式 0
  • 为什么我的 Python 散点图不起作用?

    我使用 pylab 创建了一个非常简单的散点图 pylab scatter engineSize fuelMile pylab show 该程序的其余部分不值得发布 因为正是该行给我带来了问题 当我将 散点 更改为 绘图 时 它会绘制数据图
  • 阻止 BeautifulSoup 将我的 XML 标签转换为小写

    我正在使用 BeautifulStoneSoup 来解析 XML 文档并更改一些属性 我注意到它会自动将所有 XML 标签转换为小写 例如我的源文件有
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许

随机推荐

  • 来自 Spring Hateoas 的文档 HAL“_links”(带有招摇)? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为我的客户开发团队记录一个 REST 服务 所以我添加了一些Links from Spring H
  • 将mat文件转换为pandas dataframe问题

    你好 我一直致力于将 matlab 矩阵良好地转换为 pandas 数据帧 我转换了它 但我有一行 其中有列表列表 这些列表通常是我的行 import pandas as pd import numpy as np from scipy i
  • Qi Symbols 性能慢?

    我想提出一个让我掉进兔子洞的话题 并提出了一个关于 气 符号 这一切都是在我研究新的野兽图书馆并阅读时开始的A 教程示例 http www boost org doc libs 1 66 0 libs beast example http
  • 如何更改标记图标?

    我想知道是否有办法改变那些用作标记的红色别针 如果有办法的话 该怎么做呢 您可以在地图视图中使用以下 3 种颜色图钉 MKPinAnnotationColorGreen MKPinAnnotationColorPurple MKPinAnn
  • 在 Mac OS X Lion 上安装 pymssql 时出错

    我安装了 XCode 和 FreeTDS 我尝试连接到我的 SQL Server 它工作得很好 现在我必须在 python 上开发一个与此 SQL Server 配合使用的应用程序 并且我正在尝试安装 pymysql 但是当我启动 sudo
  • Zoomable JScrollPane - setViewPosition 无法更新

    我正在尝试编写一个可缩放图像在 JScrollPane 中 当图像完全缩小时 它应该水平和垂直居中 当两个滚动条都出现时 缩放应始终相对于鼠标坐标进行 即在缩放事件之前和之后图像的同一点应位于鼠标下方 我已经快要达到我的目标了 不幸的是 s
  • DataStudio:BigQuery 和标准 SQL

    如何使用 BigQuery 数据源在 Google Data Studio 上使用标准 SQL 查询 谢谢 Google Data Studio 现在支持 standardSQL 只需在插入查询时选中相应的框即可
  • Java ArrayList Contain 总是返回 false,尽管它包含相同的值

    这是我的洞课 class Hole public int a public int b Hole int a int b this a a this b b 所以我添加了一个包含几个洞的ArrayList public void check
  • 表值参数:以小块发送数据

    我正在读取 csv 文件并将数据作为表变量发送到存储过程 根据我迄今为止的测试 我能够在 3 分 30 秒内处理 300k 条记录 该文件可能包含多达数百万条记录 我想知道一次性将所有这些记录发送到存储过程是否是一个好主意 或者我应该分批发
  • WPF 将 DataGrid 列隐藏到绑定

    由于某种原因 我无法隐藏 WPF Toolkit 的 DataGridColumn 我正在尝试执行以下操作
  • 为什么类需要 __iter__() 来返回迭代器?

    为什么类需要定义 iter 返回 self 以获得类的迭代器 class MyClass def init self self state 0 def next self self state 1 if self state gt 4 ra
  • WPF:验证时绑定到不可为空的值

    考虑以下场景
  • lxml + django + uwsgi 未能生成正确格式的excel文件?

    当我的项目使用uwsgi启动时 生成的excel文件无法打开lxml安装在我的环境中 因为它可以成功打开django manage py runserver and gunicorn 我的主要代码如下 test excel urls py
  • OLEDB 或 Excel 对象或数据库哪一个最好

    我需要使用 Excel 2007 文件来读取数据 为此 哪一种是最好的方法 使用 OLEDB 提供程序 Excel 互操作对象 将Excel数据转储到数据库并使用过程 请指导我选择 以下是我的意见 1 使用 OLEDB 提供程序 仅当您有简
  • HTML5 Canvas 翻译(0.5,0.5)不修复线条模糊

    Reading related https stackoverflow com questions 8696631 canvas drawings like lines are blurry articles https stackover
  • 如何打开 Perl 的 Windows CMD 窗口并运行命令?

    有没有办法可以打开一个新的cmd窗口并传递一个变量 完成后关闭该窗口 我找到了一些信息 但还不足以让它发挥作用 system start List Perl files dir c dfd dfdf pl B 打开窗口但不运行脚本 主要脚本
  • 我可以使用 --recursive 选项(对于子模块)向 git clone 添加用户名和密码吗?

    我正在使用 git 通过 https 克隆存储库 如下所示 git clone https username password alocation git repo git 这很好 但它也有大量的子存储库可供克隆 所以我使用 recursi
  • 试图理解 lambda

    当我做 dict Alice 7898 Beth 9102 Cecil 3258 print filter lambda x x dict Alice 它显示 7898 当我做下一步的时候 dict Alice 2341 Beth 9102
  • robots.txt URL 格式

    根据这一页 http www robotstxt org robotstxt html User agent 或 Disallow 行中不支持 globbing 和正则表达式 然而 我注意到堆栈溢出机器人 txt https stackov
  • 比较:导入语句与 __import__ 函数

    作为问题的后续使用内置的 import 正常情况下 https stackoverflow com q 46173417 7051394 我进行了一些测试 并得到了令人惊讶的结果 我在这里比较经典的执行时间import声明 并呼吁 impo