我在Stack Overflow的一篇評論中讀到,在更改列表時,切片分配效率更高。例如,Python切片分配內存使用
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 2011-02-09 17:59:06
@Brandon:這也是事實,我可能應該在我的問題中提到這個區別。感謝您的輸入。 – 2011-02-09 18:03:36