繁体   English   中英

在for循环中销毁实例时,Python性能会提高

[英]Python performance gains when destructing instances within a for loop

我正在使用Python脚本读取一些ASCII文件,操纵它们的值并获得输出。 计算是在类实例中完成的,类似于伪形式

def __init__(input)
  self.input = input
  self.output = function of input 

具有问号之间有争议部分的伪代码是

open file
read lines
for each lines in file: 
    split line
    construct class instance with input from split-line values
    store instance.output in a help variable (list)
    ?? delete class instance ??
further processing of the help variable
etc

删除类实例是阻碍还是节省时间和内存的机会? 问题的规模很大(不足一百万行)。

对我来说很明显,我宁愿从二进制文件中读取数据,但目前尚不可行。 另外,由于优雅,我选择类构造,也许随着脚本的发展,我可以从封装中获得更多好处。 但是,如果建议这样做,我可以在现阶段放弃。

为什么要编写伪代码,而不仅仅是python? 无论如何,在python中删除类实例是没有意义的,只要您打算用新实例的下一个循环覆盖名称。 当没有引用保留时,解释器将自动删除内存中的对象。

因此,这两个选项几乎都需要相同的时间(见下文):

from collections import UserList

def with_del():
    for i in range(10000):
        x = UserList([i])
        del x

def without_del():
    for i in range(10000):
        x = UserList([i])

%timeit with_del()
8.19 ms ± 188 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit without_del()
8.04 ms ± 92.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

with_del可能需要花费更长的时间,因为还有一条额外的字节码指令要运行。

当作为垃圾收集过程的一部分而没有更多引用时,Python会自动为您破坏一个实例,因此除非您确实希望在仍有引用的情况下删除该实例,否则您不应该自己执行该操作。

在您的情况下,每次迭代都会创建新的实例,并且由于您只将实例的派生输出而不是实例本身存储到列表中,因此在下一次迭代中不会保留对旧实例的任何引用,因此垃圾收集过程将以一种有效的方式为您破坏实例,因此您不必担心自己做。 实际执行此操作实际上会比较慢,因为您将使用Python代码进行删除,而不是使用纯C语言实现的垃圾回收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM