我是Python新手,目前我正在解決問題以提高編程技能。目前我正在處理一個問題,我必須stable sort
輸入和輸出反向穩定的排序值。我編寫了它,並在網站的在線裁判和一個測試用例(不知道測試用例)中執行代碼,我得到了Memory Limit Exceeded
錯誤。因此,經過一番調查,我發現代碼中存在memory leak
,代碼不完全有效。所以我已經安裝了python的memory_profiler
來監視進程的內存消耗以及我的代碼的內存消耗的逐行分析。識別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
此代碼對於更高輸入或更高數字無效嗎?從分析中我可以看到只有更少的內存被利用,但對於那個特定的測試案例,我可以看到內存利用率超過了16MB。 有人能告訴我我在哪裏做錯了。我的方法錯誤或流程錯誤?你能告訴我爲什麼我無法按預期得到產出嗎?提前致謝。任何幫助將非常感激。
預期輸出是什麼?你爲什麼認爲它應該使用更少的內存? – gil
更新了問題以顯示預期的輸出 – Dev
看起來您的代碼是正確的,就像我的修訂版本一樣。既然沒有辦法知道測試用例(設計這個在線課程的人應該真的重新考慮這個問題),我們來看看是否刮掉列表並將'range'改爲'xrange'會有幫助。 – gil