我在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
中,使匿名列表漂浮直至垃圾回收。如果是这种情况,那么前一种方法将使用相同数量的内存,同时速度较慢。
有人能够明确地展示(通过基准测试或官方文档)哪种方法更省内存/哪种方法是首选方法吗?
提前感谢。