我最近使用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