python - 导入模块基准

标签 python performance time

我一直在进行一些性能测试,并对我的最新发现感到非常好奇。

>>> timeit("import timeit")
0.8010718822479248
>>> timeit("from timeit import timeit")
1.3421258926391602

与仅导入特定部分相比,如何导入整个模块更快

根据答案,我一直在做一些测试,我遇到了以下问题:

>>> timeit("x = timeit.timeit", setup="import timeit")
0.09205102920532227
>>> timeit("x = timeit", setup="from timeit import timeit")
0.0244600772857666

关于性能,如果您计划大量使用一个类/函数/子模块,那么如果您指定从哪里导入并且可以抵消甚至可以减少时间弥补进口损失的时间。

最佳答案

因为当你想导入模块的一个/某些部分时,所有搜索模块的命名空间,将对象存储在堆栈中并从中弹出都需要时间,而要立即导入模块,python 只需执行一个步骤,将模块绑定(bind)到它的名称。

为了更好的演示,您可以使用 dis 模块分别检查两个配方的字节码:

In [10]: def import_all():
    import timeit
   ....:     

In [11]: def import_one():
   ....:     from timeit import timeit
   ....:     

In [12]: import dis

In [13]: dis.dis(import_all)
  2           0 LOAD_CONST               1 (0)
              3 LOAD_CONST               0 (None)
              6 IMPORT_NAME              0 (timeit)
              9 STORE_FAST               0 (timeit)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

In [14]: dis.dis(import_one)
  2           0 LOAD_CONST               1 (0)
              3 LOAD_CONST               2 (('timeit',))
              6 IMPORT_NAME              0 (timeit)
              9 IMPORT_FROM              0 (timeit)
             12 STORE_FAST               0 (timeit)
             15 POP_TOP
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE

如您所见,在第二种情况下,我们比第一种情况多了一个 IMPORT_FROMPOP_TOP

关于python - 导入模块基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511774/

相关文章:

c++ - 将共享指针还是原始指针传递给函数

sql - 如何优化查询以计算行相关的日期时间关系?

c - 我需要更好的解决方案来获取 C 中程序的执行时间

sql - 在 Informix SQL 中将时间戳舍入到一整小时

c - 在c中找到时间之间的差异

IE8 中的 Javascript 非常慢,IE7 + 其他使用 jQuery、jQuery UI、nyroModal 的速度很快

python - Unindent 不匹配任何外部缩进级别?

python - Linux 发行版名称解析

python - 如何在 Python 中实现一个行为类似于序列的最小类?

python - 如何从内存中包含.wav文件的zip文件播放HTML页面上的音频文件?