5

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

  1. 是否有足够多的资源对高流量网站产生影响?
  2. 为此目的在函数内部导入是否是一种糟糕的做法,以至于在所述影响下应该避免它?

注意:这可能被认为是过早的优化,但我对那个论点不感兴趣。让我们假设,为了实用的理论,这是一个完整的网站,有大量的流量,需要以各种可能的方式进行优化,并且应用程序代码和数据库已经由 50 名博士数据库管理员和开发人员进行了全面优化,而这些进口是唯一剩下的东西。

4

5 回答 5

15

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

于 2010-11-02T18:18:56.403 回答
5

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

您可以做一些事情来清理和改进您的导入:

  • 不要使用野生进口,例如from x import *
  • 在可能的情况下,只需使用正常的导入,例如import x
  • 尝试将您的代码拆分为可以单独调用的更小的模块,以便进行更少的导入

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

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

于 2010-11-02T18:20:18.973 回答
4

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

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

于 2010-11-02T18:18:53.970 回答
1
  1. 不,与其他答案相同的原因。

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

顺便说一句,你也可以懒惰地导入。例如,导入工具包可以在顶级代码中“导入”一个模块,但在访问其中一个属性之前,该模块不会真正加载。

于 2010-11-28T18:44:20.537 回答
0

有时遵循样板是有意义的:

foo = None

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

    foo.bar()

当强化以很少改变的东西为条件时,这是有道理的,例如,一个服务器强化而另一台从不这样做,或者如果您不想或不能在应用程序启动或大多数测试期间安全地导入 foo。

于 2012-09-30T14:11:33.023 回答