创建新实例和设置现有实例哪个更快?
在Python 2.7中(或者说在编程语言中),创建一个新的类或变量实例,和把一个已有的实例设置为新的值,哪个更快呢?
比如,创建another_pic.png
,哪种方式更快呢?是这样:
my_img = Image.open(cur_directory_path + '\\my_pic.png') # don't need this anymore
new_img = Image.open(cur_directory_path + '\\another_pic.png') # but need this new pic
还是这样:
my_img = Image.open(cur_directory_path + '\\my_pic.png') # don't need this anymore
my_img = Image.open(cur_directory_path + '\\another_pic.png') # but need this new pic
我之所以问这个,是因为我在代码中有一个图像变量,我经常把它重置为不同的内容。我想知道这样做是否会影响性能。
3 个回答
从技术上讲,如果你重复使用变量,而这些变量存储的是同类型的对象,那么比起每次都创建一个新变量,这样做会更快。这主要是因为内存的地址问题。如果你已经有了一个变量(它在内存中有一个地址),那么访问和更新这个内存位置的对象就会很方便。我提到对象类型要相同,是因为在运行时创建类和对象时,内存的分配方式是这样的。至于为什么创建新变量来存储对象会更慢,是因为它需要在内存中找到合适的空间(确保有足够的空闲空间来放置对象),然后把这个地址分配给新变量。这一过程涉及到查找地址的表格,具体的表格配置也会影响时间。其实,这两者之间的差别非常小,在正常的应用中你是不会注意到的。
它们是完全一样的。两者都经过了导入图片的过程。变量赋值只是存储了对这个对象的引用。唯一的区别是,后者可能会更早开始清理 my_pic.png
这个图片,因为没有其他地方再引用这个对象了。
在这两种情况下,你创建的都是两个全新的对象,速度是一样的,所以我觉得没有哪个更快。你并不是在真正“重置”一个对象,而只是给它重新起了个名字。实际上,你只是把一个指针(指向对象的地址)改成了新的内存位置,这个过程只需要非常短的时间。
主要的区别在于,使用下面的选项时,你留下了一个未使用的对象,垃圾回收器会去处理它。不过,释放内存并不是一个特别耗时的操作。根据你有多少个空闲对象,这个过程可能在你的程序结束之前就不会发生。但这样做会占用更多的内存,因为你有两个对象在那儿。如果你一直在导入新的图片,可能会影响到你的内存,这时候最好是重置同一个指针。或者如果你担心内存不够用,也可以手动调用垃圾回收器,但听起来你并不太担心这个。