首页 > 解决方案 > `del` 可以让 Python 更快吗?

问题描述

作为一名程序员,我通常会尽量避免使用该del语句,因为它通常是 Python 程序不需要的额外复杂功能。但是,在浏览标准库(threading,os等...)和伪标准库(numpy,scipy等...)时,我看到它使用了非零次数,我想更好地理解什么时候这是/不合适的del陈述。

具体来说,我很好奇Pythondel语句和Python程序效率之间的关系。在我看来,这del可以通过减少需要筛选的杂乱查找指令的数量来帮助程序运行得更快。但是,我也可以看到额外指令占用的时间多于节省的时间。

我的问题是:有没有人有任何有趣的代码片段来演示del显着改变程序速度的情况?我对del提高程序执行速度的情况最感兴趣,尽管可能真正受到伤害的非平凡情况del也很有趣。

标签: python

解决方案


标准 Python 库使用的主要原因del不是为了速度,而是为了清理命名空间(“避免命名空间污染”是我相信我见过的另一个术语)。正如user2357112 在评论中指出的那样,它也可以用来打破回溯循环。

让我们举一个具体的例子:cpython 实现中 types.py 的第 58 行内容如下:

del sys, _f, _g, _C, _c, # Not for export

如果我们看上面,我们会发现:

def _f(): pass
FunctionType = type(_f)
LambdaType = type(lambda: None)         # Same as FunctionType
CodeType = type(_f.__code__)
MappingProxyType = type(type.__dict__)
SimpleNamespace = type(sys.implementation)

def _g():
    yield 1
GeneratorType = type(_g())

_f并且_g是被del编辑的两个名字;正如评论所说,它们“不用于出口”。1

您可能会认为这是通过以下方式涵盖的:

__all__ = [n for n in globals() if n[:1] != '_']

(在同一个文件的末尾附近),但是作为python __all__ 模块级变量的用途是什么?(以及链接的Can有人在 Python 中解释 __all__ 吗?)请注意,这些会影响 via 导出的名称from types import *,而不是 via 可见的名称import types; dir(types)

没有必要清理你的模块命名空间,但这样做可以防止人们潜入其中并使用未定义的项目。所以它有几个目的。


1似乎有人忘记更新此内容以包含_ag. _GeneratorWrapper不幸的是,更难隐藏。


推荐阅读