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

时间:2018-10-17 08:41:28

标签: python performance loops class destructor

我正在使用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

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

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

2 个答案:

答案 0 :(得分:2)

为什么要编写伪代码,而不仅仅是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可能需要花费更长的时间,因为还有一条额外的字节码指令要运行。

答案 1 :(得分:2)

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

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