Python:优化导入

时间:2012-05-20 10:37:56

标签: python import

在代码中加载模块的位置是否重要? 或者它们都应该在顶部声明,因为在加载时,外部模块必须加载,无论它们在代码中声明的位置......?

示例:

from os import popen

try:
    popen('echo hi')
    doSomethingIllegal;
except:
    import logging                   #Module called only when needed?
    logging.exception("Record to logger)

或者这是由编译器以与以下相同的方式进行优化:

from os import popen
import logging                      #Module will always loaded regardless

try:
    popen('echo hi')
    doSomethingIllegal;
except:
    logging.exception("Record to logger)

2 个答案:

答案 0 :(得分:10)

This表示它可能有所作为:

“import语句几乎可以在任何地方执行。将它们置于函数内以限制其可见性和/或缩短初始启动时间通常很有用。虽然Python的解释器已经过优化,无法导入模块多次,重复执行import语句会严重影响某些情况下的性能。“

这两个操作系统问题local import statements?import always at top of module?详细讨论了这个问题。

最后,如果您对特定的案例感到好奇,可以在您的环境中对您的两个备选方案进行概述/基准测试。

我更喜欢将所有的import语句放在源文件的顶部,遵循样式约定并保持一致性(此外,它还可以使更改更容易,无需查找源文件,查找分散在各处的import语句)

答案 1 :(得分:2)

一般的经验法则是,导入应该位于文件的顶部,因为这样可以更容易地遵循代码,并且可以更轻松地找出模块所需的内容,而无需查看所有代码。

Python样式指南涵盖了导入应如何显示的一些基本指导原则:http://www.python.org/dev/peps/pep-0008/#imports

但实际上,有时候从特定功能中导入是有意义的。这会产生循环的进口:

# Module 1
from module2 import B

class A(object):
    def do_something(self):
        my_b = B()
        ...

# Module 2
from module1 import A

class B(object):
    def do_something(self):
        my_a = A()
        ...

这不会按原样运作,但你可以通过移动导入来解决循环问题:

# Module 1
from module2 import B

class A(object):
    def do_something(self):
        my_b = B()
        ...

# Module 2
class B(object):
    def do_something(self):
        from module1 import A
        my_a = A()
        ...

理想情况下,您可以设计类,使其永远不会出现,甚至可能将它们包含在同一个模块中。在那个玩具示例中,每个导入另一个真的没有意义。但是,在实践中,在某些情况下,在方法本身中包含一个方法的导入更有意义,而不是将所有内容都放入同一个模块中,或者将有问题的方法提取到其他对象中。

但是,除非你有充分的理由偏离,否则我会说顶级模块惯例。

相关问题