Процесс Python, увеличивающий использование оперативной памяти

Я использовал Python несколько месяцев, и эта проблема появилась два или три дня назад. В данный момент я запускаю этот код в графическом интерфейсе Python IDLE 3.4.3:

x = [1,2,3,4,5]

for i in x:
   x.append((i * (i + 1))/2)

print(x)

Но это не вывод или ошибка (не единственная), консоль просто открывается и ее ждет (как мышление), а затем я проверяю процесс в задаче администратора, и я вижу, что процесс запускается через 30-35 мб и после одного или две минуты процесс занимает:

Проблемные изображения

Я не установил новое программное обеспечение или что-то с ОС, это происходит на двух разных ноутбуках (W7 и W10), может быть этот код, я знаю (это работает, если я создаю новый пустой список), но как насчет других простых инструкций, таких как 1+1 Я пробовал с разными IDE и версиями Python, включая архитектуру. Сначала я использовал записную книжку iPython и Spyder, потому что мне нужно строить графики, и Anaconda поставляется со всем готовым, но ядро ​​всегда показывало Busy и без вывода; Я перезагружаю, прерываю новое ядро, но оно не работает, и это происходит только на этой неделе, потому что я работал отлично, поэтому мне пришлось удалить его, потому что это происходит.

У кого-то есть идея, что происходит?

1 ответ

Решение

Чтобы увидеть, что происходит, позвольте мне немного изменить ваш код

x = [1,2,3,4,5]

for i in x:
    x.append((i * (i + 1))/2)
    print(x)
    if len(x) > 20:
        break

print(x)

Вывод выглядит так

[1, 2, 3, 4, 5, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0, 1.0]

append просто добавляет новое значение в конец списка, поэтому вы создали бесконечный цикл, где x просто будет расти все больше и больше. В основном каждый раз, когда итератор рисует число из x новый номер добавляется в конец xтаким образом, итератор всегда будет иметь еще 5 чисел, которые нужно нарисовать до его завершения.

Поскольку итератор продолжает работать, x становится все больше и больше и потребляет все больше и больше памяти.

Чтобы исправить этот бесконечный цикл, вы можете сохранить результаты в другом списке или иметь break условие, которое я использовал выше, если вы действительно хотите, чтобы результаты были добавлены к x, Кроме того, если вы хотите заменить значения в x вы можете сделать что-то вроде этого

x = [1,2,3,4,5]

for i, v in enumerate(x):
    x[i] = (v * (v + 1))/2

print(x)

какие выводы

[1.0, 3.0, 6.0, 10.0, 15.0]

Надеюсь, это поможет.

Другие вопросы по тегам