在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
我问,因为我有一个Image变量,我“绕过”可以说在我的代码中,不断被重置为各种各样的东西,我想知道这是否会影响性能。
答案 0 :(得分:2)
在这两种情况下,你都会以完全相同的速度创建两个全新的物体,所以为此我不认为其中任何一个比另一个更快。你永远不会真的"重置"一个东西;你只是重新分配一个名字。所有这一切都发生在您将现有指针更改为新的内存位置,这只是一小部分时间的一小部分。
主要区别在于使用bottom选项,您为垃圾收集器留下了一个未使用的对象,但释放内存不是一项速度非常快的任务。它可能(取决于你周围的自由物体的数量)在你的程序结束之前甚至不会发生。但是你通过保持两个物体在周围来使用更多的记忆。因此,如果您不断地导入新图像,以至于它可能会影响您的记忆,那么最好重置相同的指针。或者你甚至可以手动调用垃圾收集器,如果你担心内存不足,但它听起来并不像你。
答案 1 :(得分:1)
他们完全一样。两者都经历导入图像的过程。变量赋值仅存储对象的引用。唯一的区别是后者可能会更快地开始垃圾收集my_pic.png
图像,因为没有更多对该对象的引用。
答案 2 :(得分:1)
从技术上讲,重用变量的速度要快,只要它们存储相同类型的对象然后不断创建一个新变量。这归结为内存中的寻址以及如果你已经有一个变量(内存中的地址与之关联)的事实,那么很容易访问内存中的那个插槽并更新位于那里的对象。我提到对象类型应该相同的原因是因为在运行时创建类和对象时如何分配内存。至于为什么创建一个新的变量来存储对象的速度较慢是因为它必须在内存中找到适当的空间(对象有足够的可用空间),然后将该地址分配给该变量。这涉及访问地址查找表,并且根据表配置也会增加时间。问题是差异太小,以至于在任何正常的应用程序中你都不应该注意到它。