2010-01-24 3 views
3

훨씬 큰 dicts에 대해 다음을 수행하는 더 빠른 방법이 있습니까? 갔지으로 액세스Python에서 빠른 기본 별칭 찾기

aliases = { 
      'United States': 'USA', 
      'United Kingdom': 'UK', 
      'Russia': 'RUS', 
      } 
if countryname in aliases: countryname = aliases[countryname] 
+0

큰 dicts가 빠릅니다. –

답변

6

"in"은 사전의 경우 0 (1)이므로 해결책은 문제가 없습니다.

당신은 타이핑 저장하려면이 같은 뭔가를 할 수 :

countryname = aliases.get(countryname, countryname) 

을 (하지만보다 읽기 더 쉽게 코드를 찾을 수)는 속도에 관해서

을, 어떤 솔루션은 최고입니다 대다수의 '히트'또는 '미스'가 있을지 여부에 달려 있습니다. 하지만 차이가있을 때는 아마 나노초 범위가 될 것입니다.

+0

부품 점수 때문에 올린 횟수는 안타 수 또는 미스 수에 따라 다릅니다. – Mark

1

확인하고 변수

aliases.get(countryname) 

에 할당하는 것보다 더 빠르게 될 수 있으며 COUNTRYNAME 별명에 존재하지 않는 경우는 없음을 반환하지 않습니다.

+1

'.get()'은 기본 인자가 주어 지므로'aliases.get (countryname, countryname)'은 "will return None"문제에 관한 트릭을 할 것입니다. – balpha

+0

후속 조치에 대한 좋은 아이디어입니다. – YOU

2

목록이 메모리에 들어가면 dicts가 가장 빠른 방법입니다.

countryname = aliases.get(countryname, countryname) 

(는 사전에없는 경우 변경 COUNTRYNAME을 떠날 것이다), 또는 :

try: 
    countryname = aliases[countryname] 
except KeyError: 
    pass 
S.Mark가 지적한 것처럼, 당신도 함께 일 할 것이 조회를하고있다
0

사전이 매우 크고 많은 수표가 일치하는 것을 찾지 못할 것으로 예상되는 경우 Bloom filter 또는 파생물 중 하나를 고려하여 가양 성을 허용 할 수 있습니다.

키를 정렬하거나 파생 된 값을 가질 수 있으므로 bisection 또는 다른 root-finding 알고리즘을 구현할 수 있습니다.

먼저, 파이썬이 사전 검색을 구현하는 방법을 정확히 파악할 것입니다. 따라서 휠을 다시 발명하는 것이 아닙니다.

또한 순수한 Python 구현은 많은 반복이 필요하다면 상당히 느릴 수 있습니다. 진정으로 최적화하려면 Cython, Numpy 또는 F2Py를 고려하십시오.

(국가 이름만을 다루는 경우 내 제안을 보증 할만큼 충분히 큰 매핑을 다루지 않는다고 생각합니다.)하지만 일종의 맞춤법 검사를 수행 할 경우, 그때 ..

행운을 빈다.

관련 문제