我一直在进行一些性能测试,并对我的最新发现感到非常好奇。
>>> 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_FROM
和 POP_TOP
。
关于python - 导入模块基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511774/