del能让Python更快吗?

del能让Python更快吗?,python,Python,作为一名程序员,我通常尽量避免使用del语句,因为这通常是Python程序不经常需要的额外复杂性。但是,在浏览标准库(threading,os,等等)和伪标准库(numpy,scipy,等等)时,我发现它使用了非零次,我想更好地理解del语句何时合适 具体来说,我很好奇Pythondel语句与Python程序效率之间的关系。在我看来,del可以减少需要筛选的杂乱查找指令的数量,从而帮助程序更快地运行。然而,我也可以看到一个世界,额外的指令占用的时间比节省的时间多 我的问题是:是否有人有任何有趣的

作为一名程序员,我通常尽量避免使用
del
语句,因为这通常是Python程序不经常需要的额外复杂性。但是,在浏览标准库(
threading
os
,等等)和伪标准库(
numpy
scipy
,等等)时,我发现它使用了非零次,我想更好地理解
del
语句何时合适

具体来说,我很好奇Python
del
语句与Python程序效率之间的关系。在我看来,
del
可以减少需要筛选的杂乱查找指令的数量,从而帮助程序更快地运行。然而,我也可以看到一个世界,额外的指令占用的时间比节省的时间多

我的问题是:是否有人有任何有趣的代码片段来演示
del
显著改变程序速度的情况?我最感兴趣的是
del
提高程序执行速度的情况,尽管
del
确实会造成伤害的非平凡情况也很有趣

具体来说,我很好奇Python
del
语句与Python程序效率之间的关系

就性能而言,
del
(不包括像
delx[i]
这样的索引删除)主要用于GC目的。如果有一个变量指向某个不再需要的大对象,
del
ing该变量将(假设没有其他引用)取消分配该对象(使用CPython,这会立即发生,因为它使用引用计数)。这可以使程序更快,如果你不这样做是填补你的RAM/缓存;唯一知道的方法是实际地对其进行基准测试

在我看来,
del
可以减少需要筛选的杂乱查找指令的数量,从而帮助程序更快地运行


除非您使用了数千个变量(您不应该这样做),否则使用
del
删除变量不太可能在性能上产生任何显著的差异。

标准Python库使用
del
的主要原因不是为了速度,而是为了名称空间分离(“避免名称空间污染”)这是另一个我认为我见过的术语)。同样,它也可以用来打破回溯循环

让我们举一个具体的例子:内容如下:

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

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())
\u f
\u g
del
ed的两个名称;正如评论所说,它们“不用于出口”。1

您可能认为这是通过以下方式实现的:

__all__ = [n for n in globals() if n[:1] != '_']
(接近同一文件的结尾),但正如(和链接的)注意的那样,这些影响通过类型导入导出的名称,而不是通过导入类型可见的名称;目录(类型)

不必清理模块名称空间,但这样做可以防止人们偷偷进入模块名称空间并使用未定义的项。所以它有两个好处



1看起来好像有人忘了将此更新为包含
\u ag
<代码>\u GeneratorWrapper很难隐藏,不幸的是。

“在我看来,del可能通过减少需要筛选的杂乱查找指令的数量来帮助程序运行得更快”-这不是Python中变量查找的工作方式,几乎可以肯定的是,在你所看到的使用
del
的代码中,作者脑子里想的并不是什么。看看你给出的一个例子(
threading
),该模块使用
del
来避免全局命名空间混乱,删除dict条目,为了避免回溯引用循环。Python会在引用超出范围时删除这些引用,除非闭包需要它们,而且在大多数情况下比使用
del
更快。@user2357112当然,但在某些情况下,你肯定不想等到变量超出作用域后再释放它所指向的对象。@arshajii这个问题是我真正想问的。特别是对于大型、难以重构的单片函数。在那样的情况下,
del
能给我们带来有意义的速度提升吗。我想另一种说法是:名称空间去混乱在多大程度上影响程序速度?@Erotemic任何性能提升都不会来自“名称空间去混乱”,而是来自使用更少的内存(如果您正在填充RAM/缓存,这可能是显而易见的)。因此,也许这个问题可以作为系统硬件的一个功能来回答。在某些情况下,如果名称空间太大,哈希表将不再适合缓存,从而导致执行时间变慢,这是否正确?在这种情况下,我很想看看衡量速度慢与dict大小(wrt CPU缓存大小)的基准测试?我的想法是,一个大的名称空间(也称为哈希表)可能会有速度损失(由于哈希冲突、将页面加载到ram、缓存效率等等),或者CPython的哈希表速度太快了,这无关紧要吗?其实不重要。CPython使用自己的字典实现(我认为插槽有一些特殊情况,但对于那些
del
是完全不相关的),它的查找效率非常好,并且在很大程度上与dict大小无关。有关一些性能统计信息,请参阅:(但是,dict实现在Python的生命周期中至少更改了两次,因此不确定这里的答案是否可靠)。不过,您需要让较大和较小的词典正好穿过收缩/扩展点,这样才能产生任何效果。
__all__ = [n for n in globals() if n[:1] != '_']