8

我正在使用 Django 运行一个网站,并且我在几乎所有脚本的开头都导入了 ipdb 以使调试更容易。但是,大多数时候我从不使用模块中的功能(仅在调试时)。

只是想知道,这会降低我的表现吗?只是当我想创建一个断点时,我更喜欢这样写:

ipdb.set_trace()

相对于:

import ipdb; ipdb.set_trace()

但是我已经在几个地方看到了第二个例子,这让我想知道它是否更有效......

我只是不知道导入 python 模块与效率有何关系(假设您没有在脚本中使用模块方法)。

4

3 回答 3

3

正如@wRAR 所提到的,加载一个模块可能意味着执行任何数量的代码,这可能需要任何时间。另一方面,该模块只会被加载一次,任何后续的导入尝试都会发现该模块存在os.sys.modules并引用该模块。

在调试模式下的 Django 环境中,模块会从 Django 中删除,AppCache并且仅在更改时才实际重新导入,您可能不会这样做ipdb,因此在您的情况下,这应该不是问题。

但是,如果它会成为一个问题,有一些方法可以解决它。假设您有一个用于加载的自定义模块,您可以向其中添加一个ipdb仅在需要时才导入的函数:

# much used module: mymodule
def set_trace():
    import ipdb
    ipdb.set_trace()

在您要使用的模块中ipdb.set_trace

import mymodule

mymodule.set_trace()

或者,在您的模块之上,使用跨模块__debug__变量:

if __debug__:
    from ipdp import set_trace
else:
    def set_trace(): return
于 2011-10-04T14:32:01.867 回答
2

简短的回答:通常不会

长答案:

加载模块需要时间。如果您从网络驱动器或其他慢速源加载 python,这可能会很明显。但是,如果直接从硬盘驱动器运行,您将永远不会注意到。

正如@wRar 指出的那样,导入模块可以执行任意数量的代码。您可以在模块启动时执行任何您想要的代码。但是,大多数模块会避免在启动期间执行不合理数量的代码。所以这本身可能不是一个巨大的原因。

但是,导入非常大的模块,尤其是那些也会导致导入大量 c 模块的模块将需要时间。

所以导入需要时间,但每个模块只导入一次。如果您在模块顶部导入模块(而不是在函数中),它只适用于启动时间。基本上,您不会因为避免导入模块而获得太多优化里程。

于 2011-10-04T14:07:21.897 回答
0

导入模块但不使用它会降低(系统)性能:

  1. 导入模块需要时间
  2. 导入的模块会占用内存

虽然第一点会使您的程序启动速度变慢,但第二点可能会使您的所有程序变慢,具体取决于系统上的内存总量。

于 2011-10-04T15:25:07.133 回答