4

在诸如Django的框架,我会想象,如果一个页面上的用户的土地(运行被称为“some_page”视图功能),你必须在模块的前8吨的进口不相关的这种看法,你这些进口产品正在浪费周期。我的问题是:Python - 通过不在模块级别导入来优化?

  1. 是否有足够的资源对高流量网站产生影响?
  2. 为了达到这个目的,在函数中导入内部函数是不是很糟糕的做法,以至于在上述影响下应该避免这种做法?

注意:这可能被认为是不成熟的优化,但我对这个说法不感兴趣。为了实际的理论,我们假设这是一个完整的网站,其中包含大量流量,需要尽可能进行优化,应用程序代码以及数据库已经由50位PhD数据库管理员和开发人员进行了全面优化,而这些进口是唯一剩下的东西。

+0

没有分析数据,这是过早的优化。请提出请求,在提出这样的假设性问题之前查看数据。请分析数据,以便您可以看到这两种设计的实际成本。请。得到。数据。 – 2010-11-02 19:29:27

+0

对于那些绊倒这个问题的人:http://wiki.python.org/moin/PythonSpeed/PerformanceTips#ImportStatementOverhead – orokusaki 2010-11-02 20:09:41

+0

请注意,假设:“用户登陆页面(运行称为”some_page“的视图函数)而且你在模块的顶部有8个与该视图无关的导入,你就是在浪费这些导入的周期“是错误的。对于每个服务页面,模块都是从头开始重新加载的。绊倒这个问题将导致不必要的混淆,因为这个假设是错误的。 – 2010-11-02 21:09:53

回答

15

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

4

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

2)是的,这将是一个反优化,使在视图级别进口。

5

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

有几件事情可以做,以清理和改善你的进口:

  • 不要使用野生例如进口from x import *
  • 只要有可能,只需使用正常的导入方式即可。 import x
  • 尝试了分割你的代码转换成更小的模块可以单独调用,从而使进口减少由

另外,将进口在模块的顶部是一个风格问题。 PEP 8说,模块需要在顶部导入,这是有原因的。这样可读性和可维护性要高得多。

最后,由于from x import *在功能级别上不是有效的Python 3.x,所以在功能级别的一些导入将会导致未来的兼容性问题。

+0

有趣的是,我没有意识到Python 3k中的这种变化。谢谢。 – orokusaki 2010-11-02 20:06:19

1
  1. 编号与其他答案相同。

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

顺便说一句,你也可以懒洋洋地进口。 例如,Importing工具包可以将顶层代码中的模块“导入”,但只有在访问其中一个属性时才会实际加载该模块。

0

有时以下的锅炉板是有道理的:

foo = None 

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

    foo.bar() 

这是有道理的,当foorification是对的东西,很少改变,例如条件一台服务器启动而另一台服务器永远不启动,或者如果您不希望或在应用程序启动或大多数测试期间无法安全地导入foo。