python - `del` 可以让 Python 更快吗?
问题描述
作为一名程序员,我通常会尽量避免使用该del
语句,因为它通常是 Python 程序不需要的额外复杂功能。但是,在浏览标准库(threading
,os
等...)和伪标准库(numpy
,scipy
等...)时,我看到它使用了非零次数,我想更好地理解什么时候这是/不合适的del
陈述。
具体来说,我很好奇Pythondel
语句和Python程序效率之间的关系。在我看来,这del
可以通过减少需要筛选的杂乱查找指令的数量来帮助程序运行得更快。但是,我也可以看到额外指令占用的时间多于节省的时间。
我的问题是:有没有人有任何有趣的代码片段来演示del
显着改变程序速度的情况?我对del
提高程序执行速度的情况最感兴趣,尽管可能真正受到伤害的非平凡情况del
也很有趣。
解决方案
标准 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
不幸的是,更难隐藏。
推荐阅读
- node.js - grunt 命令给出 sassc: not found
- javascript - css 未在 webpack 上加载
- anaconda - 文件夹 .anaconda、.conda、.ipython、.jupyter 等
- django-rest-framework - 使用 Django REST 框架在 GCP 上上传图像
- vba - 将多个屏幕截图粘贴到单个 Outlook 电子邮件
- node.js - 对于 Node.js 项目中的所有子文件夹,对 require 使用全局自定义入口点
- python - 无法将 int 字符串转换为 chr 字符串
- c - pthread_create 使用 85MB VIRT 而不是 8MB VIRT
- spring-boot - 无法在带参数的获取请求中发送外部获取请求
- email - 如何在 Mailchimp 联系人中保存 200 多个自定义合并字段