Python "import" 性能查询

1 投票
4 回答
590 浏览
提问于 2025-04-16 23:01

有个人跟我提到,使用import package来导入一个包会让代码更容易阅读。这是真的吗?我意思是,跟from package import x, y, z相比,使用这个语句是不是会多导入整个包,造成一些额外的负担呢?

4 个回答

3

使用点符号来调用函数总是比直接导入函数并调用它要慢,因为系统需要在模块字典中查找这个函数。这种情况在每次使用getattr的时候都会发生。

比如说,当你要往一个列表里添加东西时:

lst     = []
for i in xrange(5000):
    lst.append(i ** .5 * 2)

这样做会更快:

lst     = []
append  = lst.append
for i in xrange(5000):
    append(i ** .5 * 2)

可能会带来很大的差别。

>>> def bad():
...     lst     = []
...     for i in xrange(500):
...         lst.append(i ** .5 * 2)
>>> def good():
...     lst     = []
...     append  = lst.append
...     for i in xrange(500):
...         append(i ** .5 * 2)
>>> from timeit import timeit
>>> timeit("bad()", "from __main__ import bad", number = 1000)
0.175249130875
>>> timeit("good()", "from __main__ import good", number = 1000)
0.146750989286
3

无论你用什么方式导入模块,性能都是一样的。第一次导入一个模块时,整个模块会被编译(如果需要的话),然后代码会被执行。所以,不管你选择哪种导入方式,结果都是一样的。

7

我认为不会有性能上的差别。整个包都会被加载进来。

举个例子:

# load dirname() function from os.path module
>>> from os.path import dirname

#the os.path.basename() was not imported
>>> basename('/foo/bar.txt')
NameError: name 'basename' is not defined

# however, basename() is already available anyway:
dirname.__globals__['basename']('/foo/bar.txt')

撰写回答