Процесс 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]
Надеюсь, это поможет.