我最近使用dictoionaries編寫了一個python解決方案,它得到了TLE判決。該解決方案與C++中的multiset解決方案非常相似。所以,我們確信這個邏輯是正確的,但是實現並不符合標準。如何提高python字典性能?
問題描述爲下面的代碼的理解(http://codeforces.com/contest/714/problem/C):
- 對於每一個我們需要得到0和1組成的串號,使得第i個數字是0/1,如果在數量上相應的第i位是偶數。
- 我們需要維護具有上述點給出的相同映射的數量。
任何提示/指針,以改善以下代碼的性能?它爲一個大型測試案例(http://codeforces.com/contest/714/submission/20594344)提供了TLE(超出時間限制)。
from collections import defaultdict
def getPattern(s):
return ''.join(list(s.zfill(19)))
def getSPattern(s):
news = s.zfill(19)
patlist = [ '0' if (int(news[i])%2 == 0) else '1' for i in range(19) ]
return "".join(patlist)
t = int(raw_input())
pat = defaultdict(str) # holds strings as keys and int as value
for i in range(0, t):
oper, num = raw_input().strip().split(' ')
if oper == '+' :
pattern = getSPattern(str(num))
if pattern in pat:
pat[pattern] += 1
else:
pat[pattern] = 1
elif oper == '-' :
pattern = getSPattern(str(num))
pat[pattern] = max(pat[pattern] - 1, 0)
elif oper == '?' :
print pat.get(getPattern(num) , 0)
儘管不是perf-tuning方面的專家,但我期望字典查找性能相當高。我會傾向於更多地關注'getSPattern'函數,因爲我相信可以從中擠出一些東西。現在,在我們開始之前,我閱讀了比賽,但是無法得到時間限制的衡量標準:它只是在'?'測試? –
sal
@sal時間限制是根據每個測試用例執行測量的。因此,對於輸入數字爲100000的TLE的大型測試用例。如果您滾動到提交鏈接的最底部,則可以檢查該內容。 – mtk
明白了。試試這個版本:https://eval.in/641639我只改變了你的'getSPattern',並刪除了'defaultdict'(儘管你可以保留它)。看看這是否能夠提升你的表現。如果是的話,我會添加一個答案,提供更多關於它的細節。 – sal