2009-12-15 3 views
1

두 개의 배열 hashestable이있는 경우 각 값에 대해 hashes으로 배열의 요소 값 오프셋에 요소의 위치를 ​​저장하려고합니다. table. 다음은 순진한 알고리즘입니다.고성능 구현 방법은 파이썬에서 이러한 유형의 삽입을 수행합니까?

def insert_n(table,hashes): 
    for x in xrange(len(hashes)): 
     table[hashes[x]]=x 

매우 느립니다. Psyco는 여기에서 약간을 돕지 만, 거의.

numpy.insert(table,numpy.arange(len(hashes)),hashes) 

하지만 내 벤치 마크에 따르면,이 여전히 같은 간단한 작업을 매우 느리게 :

NumPy와는 솔루션을 제공합니다. 파이썬에서 사용할 수있는 이것을 수행하는 더 빠른 방법이 있습니까?

몇 가지 추가 예제 코드 :

table[hashes] = numpy.arange(len(hashes), dtype=numpy.uint32) 

당신이와 속도를 비교할 수 있습니다

import numpy 

from time import time 

table_size=2**20 

hashes_size=2**19 

table=numpy.zeros(table_size,dtype=numpy.uint32) 

hashes=numpy.fromstring(numpy.random.bytes((hashes_size)*4), 
         dtype=numpy.uint32)%table_size 

t0=time() 

numpy.insert(table,numpy.arange(len(hashes)),hashes) 

print time()-t0 
+0

하나의 해시가 여러 개있는 경우 테이블이 마지막 해시를 가리키고 있다는 것을 알고 계십니까? –

+0

예, 충돌로 인해 값의 일부가 손실되어 더 높은 속도와 균형을 이룰 수있는 캐싱 시스템 유형입니다. 어쨌든 새로운 항목은 캐시 히트 가능성이 더 높다고 가정합니다. – user213060

+0

이 질문에 대한 편집 내용은 무엇이며, OP는 대답을 수락하지 않으시겠습니까? – Roman

답변

2

이 (가정 테이블과 해시가 numpy.uint32 배열 인) 빠르고 간단하다 :

table[hashes] = xrange(len(hashes)) 

그런데 numpy.insert은 for-lo와 같은 것을하지 않습니다. 당신은 게시했습니다.

+0

완전히 맞았습니다. put을 사용하려고 할 때 insert를 사용했습니다. (이것은 당신의 분할 할당과 동일합니다.) 알았습니다. – user213060

관련 문제