【问题标题】:Which is a better practice - global import or local import哪个是更好的做法 - 全局导入或本地导入
【发布时间】:2013-12-19 05:12:52
【问题描述】:

我正在使用 django 开发一个应用程序,我怀疑在全局级别导入库是否比在本地(每个函数)级别导入对内存或性能有任何影响。如果按功能或视图导入,则单独导入需要的模块节省空间对吗?或者这样做有什么负面影响?

【问题讨论】:

  • 我对django了解不多,但是如果多个函数需要导入同一个模块,在每个函数中导​​入岂不是很浪费?
  • @aIKid:但我认为服务器端执行仅在客户端请求时执行功能。那么全部导入会不会很浪费内存呢?这是我的问题
  • 如果模块被导入一次,从那时起它将在内存中。最好立即这样做,如果您的模块大小是内存问题,那么您的情况非常不典型。
  • 如果服务器上运行多个程序怎么办?他们还会在记忆中吗?
  • @alKid:这不是(显着)浪费时间,因为第一次导入之后的后续导入将很快在sys.modules 中找到模块。这可能是浪费打字。

标签: python django import


【解决方案1】:

您肯定已经注意到,几乎所有 Python 代码都在文件顶部进行导入。这是有原因的:导入的开销很小,而且您很可能会在进程生命周期的某个时间点导入代码,因此您不妨将其排除在外。

在函数级别导入的唯一充分理由是避免循环依赖。

编辑 您的 cmets 表明您不了解 Web 应用程序的一般工作原理,至少在 Python 中是这样。他们不会为每个请求启动一个新流程,而是从头开始导入代码。相反,服务器根据需要实例化进程,每个进程都服务于许多请求,直到最终被杀死。因此,很可能在该生命周期内,最终将需要所有导入。

【讨论】:

  • 另外值得一提的是,文件顶部的导入和the order in which they should be written都在PEP8中提到。
  • 现在我明白了.. 谢谢
  • 非常接近我要说的。我在顶部导入 evrything,但会创建循环依赖的模块除外。
【解决方案2】:

导入语句开销

来自Python Performance Tips

将它们放置在函数中以限制它们的可见性和/或减少初始启动时间通常很有用。尽管 Python 的解释器被优化为不会多次导入同一个模块,但在某些情况下重复执行 import 语句会严重影响性能。

【讨论】:

    【解决方案3】:

    当脚本运行时,它会将模块存储在内存中,我相信你明白这一点。

    如果您在本地范围内导入,则每次客户端调用该函数时都会导入该模块。但是如果模块是在全局级别导入的,就没有必要了!

    因此,在这种情况下:全局导入获胜。

    【讨论】:

    • 但是如果服务器上运行多个程序呢?还是没有问题?
    • 你现在明白了.. 谢谢
    • 准确地说,模块将被导入一次(有时通过其他函数或全局导入),所有后续调用导入将导致sys.modules查找。
    • 多个程序?我在这里看不到与此有任何关系。但是无论是本地导入还是全局导入,单独的进程在内存中都有自己的位置。脚本a 将有自己的模块,而脚本b 将有自己的位置来存储模块。
    猜你喜欢
    • 2014-10-05
    • 2013-04-29
    • 2011-07-22
    • 2010-09-28
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多