Does a del statement open up memory?

你。 提交于 2021-02-04 19:12:05

问题


I wrote a python script that backs up my files while I'm sleeping at night. The program is designed to run whenever the computer is on and to automatically shut down the computer after the backups are done. My code looks like this:

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

The backup function is from another file that I wrote to perform more customized backups on a case by by case basis. This code all works perfectly fine, but I'm wondering if the del statement

del today

is really necessary. I put it in thinking that it would prevent my memory from getting filled up by thousands of datetime objects, but then I read that Python uses garbage collection, similar to Java. Further, does the todayvariable automatically get replaced with each pass through the while loop? I know that the program works as intended with the del statement, but if it is unnecessary, then I would like to get rid of it if only for the sake of brevity! What are it's actual effects on memory?


回答1:


I put it in thinking that it would prevent my memory from getting filled up by thousands of datetime objects

The del statement is not necessary, you may simply remove that block. Python will free the space from those local variables automatically.

... but then I read that Python uses garbage collection, similar to Java.

The above statement is misguided: this has nothing to do with the garbage collector, which exists to break up circular references. In CPython, the memory is released when the object reference count decreases to zero, and that would occur even if the garbage collector is disabled.

Further, does the today variable automatically get replaced with each pass through the while loop? I know that the program works as intended with the del statement, but if it is unnecessary, then I would like to get rid of it if only for the sake of brevity! What are it's actual effects on memory?

A new datetime object is created on each iteration of the loop. The today name in scope will be rebound to the newly created datetime instance. The old datetime instance will be deleted because no reference exists on it (since the only existing reference is lost once you rebound the name today to a different object). Once again, I stress that this is just ref-counting and has nothing to do with gc.

On an unrelated note, your program will busy-loop and consume an entire CPU with this while loop. You should consider adding a call to time.sleep into the loop so the process will remain mostly idle. Or, better yet, schedule the task to run periodically using cron.



来源:https://stackoverflow.com/questions/48139782/does-a-del-statement-open-up-memory

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!