【问题标题】:Does a del statement open up memory?del 语句会打开内存吗?
【发布时间】:2018-06-16 19:28:16
【问题描述】:

我编写了一个 python 脚本,可以在我晚上睡觉时备份我的文件。该程序旨在在计算机开启时运行,并在备份完成后自动关闭计算机。我的代码如下所示:

from datetime import datetime
from os import system
from backup import backup

while True:
    today = datetime.now()

    # Perform backups on Monday at 3:00am.
    if today.weekday() == 0 and today.hour == 3:
        print('Starting backups...')

        # Perform backups.
        backup("C:\\Users\\Jeff Moorhead\\Desktop", "E:\\")
        backup("C:\\Users\\Jeff Moorhead\\Desktop", "F:\\")
        backup("C:\\Users\\Jeff Moorhead\\OneDrive\\Documents", "E:\\")
        backup("C:\\Users\\Jeff Moorhead\\OneDrive\\Documents", "F:\\")

        # Shutdown computer after backups finish.
        system('shutdown /s /t 10')
        break

    else:
        del today
        continue

备份功能来自我编写的另一个文件,用于根据具体情况执行更多自定义备份。这段代码一切正常,但我想知道 del 语句是否

del today

真的很有必要。我认为它会阻止我的内存被数千个日期时间对象填满,但后来我读到 Python 使用垃圾收集,类似于 Java。此外,todayvariable 是否会自动替换为每次通过 while 循环?我知道该程序使用 del 语句按预期工作,但如果它是不必要的,那么为了简洁起见,我想摆脱它!它对记忆的实际影响是什么?

【问题讨论】:

  • 不,它没有。它只会减少对象的引用计数。如果要释放内存,请参阅stackoverflow.com/questions/1316767/…
  • 根据那篇文章,垃圾收集器似乎会自动为我处理它。因为我不是在处理海量数据,所以我应该没有问题。谢谢!
  • 您不会占用大量内存,但会占用大量 CPU,当您仅每周实际执行一次时,尽可能频繁地检查时间,您可能只需计算一下直到您要执行备份的时间,然后在此之前执行time.sleep
  • 好点,我添加了对 time.sleep() 的调用以每小时检查一次时间。我不想增加一整天的睡眠时间,因为我倾向于在大多数晚上关闭笔记本电脑,这样如果计算机在周一 3:00 时处于睡眠状态,它可能会错过备份时间。

标签: python del


【解决方案1】:

我认为它会阻止我的内存被成千上万的日期时间对象填满

del 语句不是必需的,您可以简单地删除该块。 Python 会自动从这些局部变量中释放空间。

...但后来我读到 Python 使用垃圾收集,类似于 Java。

上面的说法是错误的:这与垃圾收集器无关,它的存在是为了打破循环引用。在 CPython 中,当对象引用计数减少到零时会释放内存,即使禁用垃圾收集器也会发生这种情况。

此外,today 变量是否会自动替换为每次通过 while 循环?我知道该程序使用 del 语句按预期工作,但如果它是不必要的,那么为了简洁起见,我想摆脱它!它对记忆的实际影响是什么?

循环的每次迭代都会创建一个新的日期时间对象。 范围内的today 名称将被重新绑定到新创建的日期时间实例。旧的 datetime 实例将被删除,因为它上面不存在引用(因为一旦将名称 today 重新绑定到不同的对象,唯一现有的引用就会丢失)。再次强调,这只是引用计数,与gc无关。

另外,您的程序将使用这个 while 循环进行繁忙循环并消耗整个 CPU。您应该考虑在循环中添加对time.sleep 的调用,这样该进程将大部分时间保持空闲状态。或者,更好的是,使用cron 安排任务定期运行。

【讨论】:

  • “旧的日期时间实例将被删除...”正是我想要的。谢谢!
猜你喜欢
  • 2013-02-04
  • 2019-04-18
  • 2021-08-10
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多