나는 최근에 TLE 평결을 얻은 dictoionaries를 사용하여 python 솔루션을 코딩했습니다. 이 솔루션은 작동하는 C++의 멀티 세트 솔루션과 정확히 유사합니다. 따라서 우리는 논리가 정확하다는 것을 확신합니다. 그러나 구현은 그 목표에 달려 있습니다.python dict 성능을 향상시키는 방법은 무엇입니까?
코드 아래 이해 (http://codeforces.com/contest/714/problem/C)에 대한 문제 설명 : 숫자 i 번째 0/1이되도록 우리는 0과 1의 문자열을 얻을 필요가 각 번호에 대한
- 경우 수의 각각의 i 번째 자리 짝수/홀수
- 위의 설명에 의해 주어진 매핑과 동일한 매핑 수를 유지해야합니다.
아래의 코드 성능 향상을위한 힌트/포인터는 무엇입니까? 그것은 큰 테스트 케이스 (http://codeforces.com/contest/714/submission/20594344)를 위해 TLE (Time Limit Exceeded)를주었습니다.
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)
퍼포 튜닝 전문가는 아니지만 사전 조회 성능이 상당히 높을 것으로 예상됩니다. 나는 뭔가가 그곳에서 짜낼 수 있다고 믿는 것처럼 그 getSystem 함수를 더 보게 될 것이다. 이제 우리가 시작하기 전에 대회를 읽었지 만 시간 제한이 측정되는 곳을 찾을 수 없었습니다. '테스트? –
sal
@sal 시간 제한은 테스트 케이스 실행 당 측정됩니다. 따라서 입력 번호가 100000에 대해 TLE을 제공하는 대규모 테스트 케이스의 경우 제출 링크의 맨 아래로 스크롤하면이를 확인할 수 있습니다. – mtk
알았어요. 이 버전을 시도해보십시오 : https://eval.in/641639 여기서'getSPattern' 만 변경했고'defaultdict'를 없앴습니다 (계속 유지할 수는 있지만). 그것이 당신에게 어떤 성능 향상을 가져다 주는지 확인하십시오. 그렇다면 대답에 대한 자세한 내용을 추가하겠습니다. – sal