Как итеративное применение оператора `+=` к строковой переменной позволяет избежать квадратичной сложности?Python

Программы на Python
Ответить
Anonymous
 Как итеративное применение оператора `+=` к строковой переменной позволяет избежать квадратичной сложности?

Сообщение Anonymous »

Я немного запутался. Я был уверен, что из-за неизменности операции str, такой как s += "abc", необходимо скопировать все содержимое s в другое место в памяти, поэтому эффективное добавление символа в очень длинную строку будет потреблять много времени.
Я написал фрагмент, чтобы доказать свою теорию:

Код: Выделить всё

import timeit

def foo(i):
res = ""
for _ in range(i):
res += "a"
return res

def foo2(i):
res = []
for _ in range(i):
res.append("a")
return "".join(res)

iterations = 100000
print(timeit.timeit('foo(iterations)', globals=globals(), number=100))
print(timeit.timeit('foo2(iterations)', globals=globals(), number=100))
Как это выглядит
  • время выполнения растет линейно в зависимости от итераций
  • едва ли в два раза быстрее, чем foo
Я пытался проверить байт-код в поисках скрытых оптимизаций. Я попытался изменить константную строку на случайную строку подходящей длины, чтобы также запретить интернирование, но не смог найти никакого объяснения этому поведению.
Ошибся ли я тогда? Зависит ли += от длины строки или нет? Если да, то как я могу это доказать?

Подробнее здесь: https://stackoverflow.com/questions/776 ... e-manage-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»