我正在使用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
删除类实例是阻碍还是节省时间和内存的机会?问题的规模很大(不足一百万行)。
对我来说很明显,我宁愿从二进制文件中读取内容,但目前尚不可行。另外,由于优雅,我选择类构造,也许随着脚本的发展,我可以从封装中获得更多好处。但是,如果建议这样做,我可以在现阶段放弃。
答案 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语言实现的垃圾回收。