Python - 通过不在模块级别导入来优化?

时间:2010-11-02 18:10:58

标签: python optimization premature-optimization python-import

在像Django这样的框架中,我想如果用户登陆页面(运行名为“some_page”的视图函数),并且模块顶部有8个与该视图无关的导入,你在那些进口上浪费了周期。我的问题是:

  1. 是否有足够的资源来对高流量网站产生影响?
  2. 为了这个目的而在函数内部导入是否是一种不好的做法,在上述影响时应该避免它?
  3. 注意:这可以被认为是过早优化,但我对这个论点不感兴趣。让我们假设,为了实际理论,这是一个有大量流量的完整站点,需要以各种可能的方式进行优化,应用程序代码以及数据库已经由50位博士数据库管理员和开发人员进行了全面优化,这些进口是唯一剩下的东西。

5 个答案:

答案 0 :(得分:15)

不,不要这样做。在Web上的正常python执行环境(mod_wsgi,gunicorn等)中,当进程启动时,将执行这些导入,然后所有后续请求都不会重新执行脚本。如果将导入放在函数中,则每次调用函数时都必须处理它们。

答案 1 :(得分:5)

是的,在功能级别导入是一种不好的做法。通过在模块顶部使用更智能的导入,您可以创建一次性的小成本。但是,如果在函数中放置导入,则每次运行该函数时都会承担导入的成本。因此,不要导入函数,只需导入模块的顶部。

您可以采取一些措施来清理和改善您的进口:

  • 不要使用野生进口,例如from x import *
  • 尽可能使用正常导入,例如import x
  • 尝试将代码拆分为可以单独调用的较小模块,以便减少导入

此外,将导入放在模块的顶部是一种风格问题。 PEP 8说模块需要在顶部导入是有原因的。它更具可读性和可维护性。

最后,函数级别的某些导入将导致将来出现兼容性问题,因为from x import *在函数级别上不是有效的Python 3.x.

答案 2 :(得分:4)

1)答案是否定的。 Django / Python与PHP不同。您的整个模块不会像PHP包含的那样重新解释每个网页浏览。该模块将在内存中,每个页面视图将对您的视图进行简单的函数调用。

2)是的,在视图级别进行导入是一种反优化。

答案 3 :(得分:1)

  1. 没有。与其他答案相同的原因。

  2. 是。与其他回答相同的原因。

  3. 顺便说一句,你也可以懒得进口。 例如,Importing工具包可以在顶级代码中“导入”模块,但在访问其中一个属性之前,模块实际上并未加载。

答案 4 :(得分:0)

有时跟随锅炉板是有道理的:

foo = None

def foorify():
    global foo
    if not foo: from xxx import foo

    foo.bar()

当有条件的东西很少改变时,这是有道理的,例如:在应用程序启动或大多数测试期间,一台服务器会形成另一台服务器,而另一台服务器则永远不会或者不能安全地导入foo。