Использование памяти для присвоения срезов Python

Я читал в комментарии здесь, в 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 , оставляя анонимный список плавающим, пока он не будет собран в мусор. В этом случае первый метод будет использовать тот же объем памяти, но при этом будет медленнее.

Может ли кто-нибудь окончательно показать (с помощью теста производительности или официальной документации), какой из двух методов более эффективен с точки зрения памяти / который является предпочтительным метод?

Заранее спасибо.

22
задан Mitch Lindgren 9 February 2011 в 17:28
поделиться