我一直在做一些性能测试,并对我最新的发现感到好奇。
>>> 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
关于性能,如果您计划大量使用类/函数/子模块,如果您指定从哪里导入并且可以抵消甚至更少,则花费的时间更少弥补进口中丢失的时间。
答案 0 :(得分:2)
import timeit
将直接获取模块,from timeit import timeit
将花费时间浏览整个timeit模块。因此结果。
答案 1 :(得分:2)
因为当你想要导入模块的一个/某个部分时,所有搜索模块的命名空间,将对象存储在堆栈中并从中弹出它需要时间,而同时导入模块python只是执行一步,将模块绑定到其名称。
为了更好的演示,您可以使用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
。