Я новичок в Python, и сейчас я работаю над решением проблем, чтобы улучшить свои навыки кодирования. В настоящее время я работаю над вопросом, где мне нужно было ввести stable sort
и ввести значения, скорректированные на обратное. Я запрограммировал его и выполнил код в онлайн-судье веб-сайта и для одного тестового примера (не знаю теста), я получил ошибку Memory Limit Exceeded
. Поэтому после некоторых исследований я понял, что в коде есть memory leak
, и код не полностью эффективен. Поэтому я установил memory_profiler
python для мониторинга потребления памяти процесса, а также поэтапного анализа потребления памяти моего кода.Идентификация утечки памяти в python - Профайлер памяти
Ниже приведены данные ввода, кода, вывода и анализа профилей памяти, взятые из memory_profiler
.
Вход:
8
1 2
16 3
11 2
20 3
3 5
26 4
7 1
22 4
Код:
from collections import OrderedDict
@profile
def test_1():
print "Enter the number: "
n = raw_input()
k = []
v = []
print "Enter ID and M: "
for i in range(0,int(n)):
a, b = raw_input().split(' ')
k.append(a)
v.append(b)
d = OrderedDict(zip(k,v))
sorted_items = sorted(d.items(), key=lambda (k,v):int(v), reverse=True)
for i, j in sorted_items:
print i, j
if __name__ == '__main__':
test_1()
Выход:
Line # Mem usage Increment Line Contents
================================================
2 10.520 MiB 0.000 MiB @profile
3 def test_1():
4 10.531 MiB 0.012 MiB print "Enter the number: "
5 10.551 MiB 0.020 MiB n = raw_input()
6 10.551 MiB 0.000 MiB k = []
7 10.551 MiB 0.000 MiB v = []
8 10.551 MiB 0.000 MiB print "Enter ID and M: "
9 10.551 MiB 0.000 MiB for i in range(0,int(n)):
10 10.551 MiB 0.000 MiB a, b = raw_input().split(' ')
11 10.551 MiB 0.000 MiB k.append(a)
12 10.551 MiB 0.000 MiB v.append(b)
13
14 10.551 MiB 0.000 MiB d = OrderedDict(zip(k,v))
15 10.555 MiB 0.004 MiB sorted_items = sorted(d.items(), key=lambda (k,v):int(v), reverse=True)
16 10.555 MiB 0.000 MiB for i, j in sorted_items:
17 10.555 MiB 0.000 MiB print i, j
Ожидаемый результат (я в состоянии получить желаемый результат):
3 5
26 4
22 4
16 3
20 3
1 2
11 2
7 1
Является ли этот код неэффективным для более высоких входных или более высоких номеров? из анализа я мог видеть, что используется только меньше памяти, но для этого конкретного тестового примера я мог видеть, что использование памяти составляет более 16 МБ. Может кто-нибудь сказать мне, где я делаю неправильно. Является ли мой подход неправильным или поток неправильный? Не могли бы вы рассказать мне, почему я не могу получить результат, как ожидалось. Заранее спасибо. Любая помощь приветствуется.
Каков ожидаемый выход? И почему вы думаете, что он должен использовать меньше памяти? – gil
обновил вопрос, чтобы отобразить ожидаемый результат – Dev
Похоже, что ваш код верен, как и моя пересмотренная версия. Поскольку нет способа узнать тестовый пример (человек, который разработал этот онлайн-курс, должен действительно переосмыслить это), давайте просто посмотрим, поможет ли очистка списков и изменение 'range' на' xrange'. – gil