2011-02-09 1 views
2

색인 된 인스턴스 (예 : 음악 트랙)를 조작하고 색인 (int-> string)을 사용하여 객체의 이름을 조회해야합니다. Dicts가 너무 느립니다 (약 10M 개체가 있습니다). 메모리는 문제가 아니므로 가장 편리한 해결책은 csv 파일에서 이름을 사용하여 임의 액세스 배열을 만드는 것입니다.Python에서 문자열에 대한 임의 액세스 컨테이너?

그러나 파이썬에서는 이것을 만들지 못했습니다. 0 차원 배열 (문자열)을 인덱싱 할 수 없다는 오류가 발생했습니다. 문자열에 대한 임의 액세스 컨테이너를 생성하는 원시 파이썬 방법은 무엇입니까?

+1

색인이 '0'에서 'n-1'까지 연속됩니까? 그렇다면 목록을 사용하십시오. 그것은 훨씬 더 빨리 dict보다 빠르지는 않지만 더 빠를 것입니다. –

+7

데이터베이스 작업과 비슷합니다. ['sqlite'] (http://docs.python.org/library/sqlite3.html)을 들여다 보았습니까? –

+0

@Tim : 목록이 완전히 정적이지 않은 것이 더 나을 것 같습니다. –

답변

2

내가 기억하는 바로는 파이썬 사전은 평균 액세스 시간이 O (1)이지만 목록은 확실히 빠를 것입니다. 색인이 매우 희소하지 않은 경우 다음과 같이 시도 할 수 있습니다.

reader = [(1, 'a'), (2, 'b')] # Replace it with your CSV reader. 

# First, fill a dictionary: 
text_dict = {} 
for index, text in reader: 
    text_dict[index] = text 

# Then create a sufficiently large list: 
max_index = max(text_dict.iterkeys()) 
texts = [None] * (max_index + 1) 

# And fill it: 
for index, text in text_dict.iteritems(): 
    texts[index] = text 

print texts 
# prints: [None, 'a', 'b'] 
print texts[1] 
# prints: a 
+0

목록은 임의 액세스의 경우 O (1)이며 작업에 완벽하게 적합합니다. Dicts는 O (1) 읽기도 있지만 상수는 훨씬 큽니다. – 9000

+0

@sendle, 9000이 맞습니다. 그 질문/답변은 동일하지 않습니다. 그것은 우리가 사전에 특정 키를 찾고 목록에서 특정 인덱스를 찾는 것에 대해 말하고있는 동안 dict/list에 무언가가 포함되어 있는지 찾는 것에 대해 묻고 있습니다. 이 목적을 위해 목록은 올바른 색인으로 이동하는 동안 해시를 계산해야합니다. 해싱에는 더 많은 시간이 필요합니다. –

+0

@Justin, 예 죄송합니다. 나는 그 주석을 삭제했습니다. – senderle