【发布时间】:2011-06-24 07:31:42
【问题描述】:
我在 Stack Overflow 上的评论中读到,在更改列表时进行切片分配会提高内存效率。例如,
a[:] = [i + 6 for i in a]
应该比内存效率更高
a = [i + 6 for i in a]
因为前者替换现有列表中的元素,而后者创建一个新列表并将a 重新绑定到该新列表,将旧的a 留在内存中,直到它可以被垃圾回收。以两者速度为基准,后者稍快:
$ python -mtimeit -s 'a = [1, 2, 3]' 'a[:] = [i + 6 for i in a]'
1000000 loops, best of 3: 1.53 usec per loop
$ python -mtimeit -s 'a = [1, 2, 3]' 'a = [i + 6 for i in a]'
1000000 loops, best of 3: 1.37 usec per loop
这是我所期望的,因为重新绑定变量应该比替换列表中的元素更快。但是,我找不到任何支持内存使用声明的官方文档,而且我不确定如何对其进行基准测试。
从表面上看,内存使用声明对我来说是有道理的。但是,再考虑一下,我希望在前一种方法中,解释器会从列表推导中创建一个新列表,然后然后将该列表中的值复制到a,留下匿名列表浮动,直到它被垃圾收集。如果是这种情况,那么前一种方法将使用相同数量的内存,但速度也较慢。
谁能明确地展示(通过基准或官方文档)这两种方法中哪一种更节省内存/哪种是首选方法?
提前致谢。
【问题讨论】:
-
性能方面可能值得考虑,但我认为您更有可能遇到实际案例(在较大的程序中),您将引用传递给列表,例如从 Class1 到 Class2。在第一种情况下,使用切片赋值来修改 Class1 的列表将保留 Class2 的引用。在您引用的第二个实例中,修改 Class1 的列表意味着 Class2 将持有对不再有效的列表的引用。
-
@Brandon:这也是正确的,我可能应该在我的问题中提到区别。感谢您的意见。
标签: python memory-management performance benchmarking