Я прочитал в комментарии здесь о переполнении стека, что более эффективно использовать память при изменении списков.Например,
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
, оставив анонимнымсписок в плавающих вокруг, пока это не мусор.Если это так, тогда первый метод будет использовать тот же объем памяти, но при этом будет медленнее.
Может ли кто-нибудь показать окончательно (с помощью эталонного теста или официальной документации), какой из этих двух методов более эффективен в отношении памяти / какойявляется предпочтительным методом?
Заранее спасибо.