我写了一个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。此外,today
变量是否会在每次通过while循环时自动替换?我知道该程序与del语句一样正常工作,但如果没有必要,那么我想摆脱它只是为了简洁起见!它对记忆的实际影响是什么?
答案 0 :(得分:4)
我认为它会阻止我的记忆被数以千计的日期时间对象填满
del
语句不是必需的,您可以简单地删除该块。 Python将自动从这些局部变量中释放空间。
...但后来我读到Python使用垃圾收集,类似于Java。
上述陈述是错误的:这与垃圾收集器无关,垃圾收集器存在以分解循环引用。在CPython中,当对象引用计数减少到零时释放内存,即使禁用了垃圾收集器也会发生这种情况。
此外,今日变量是否会在每次通过while循环时自动替换?我知道该程序与del语句一样正常工作,但如果没有必要,那么我想摆脱它只是为了简洁起见!它对记忆的实际影响是什么?
在循环的每次迭代中创建一个新的datetime对象。
范围中的today
名称将反弹到新创建的日期时间实例。旧的datetime实例将被删除,因为它上面没有引用(因为一旦将名称today
反弹到另一个对象,唯一的现有引用就会丢失。我再次强调,这只是重新计算,与gc
无关。
在一个不相关的注释中,您的程序将忙于循环并使用此while循环消耗整个CPU。您应该考虑在循环中添加对time.sleep
的调用,以使进程保持大部分空闲状态。或者,更好的是,使用cron
安排任务定期运行。