2009-12-15 3 views
1

Étant donné deux matrices hashes et table, pour chaque valeur dans hashes Je veux stocker la position de l'élément au décalage de la valeur de l'élément dans le tableau table. Voici l'algorithme naïf:Méthode plus performante faire ce type d'insertion de python?

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

Ceci est extrêmement lent. Psyco aide certains ici, mais à peine.

Numpy a une solution:

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

Mais selon mes repères, cela est encore très lent pour une opération simple. Existe-t-il un moyen plus rapide d'effectuer cela qui peut être utilisé à partir de python?

quelques exemples de code supplémentaires:

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

Vous êtes conscient que s'il y a plusieurs instances d'un hachage, alors la table pointera vers la dernière seulement? –

+0

Oui, c'est pour un type de système de mise en cache où il est parfaitement possible d'échanger la vitesse supérieure pour perdre certaines des valeurs dues à la collision. Les entrées les plus récentes seront supposées être des occurrences de cache plus probables de toute façon. – user213060

+0

Qu'est-ce qui se passe avec les modifications sur cette question, et pourquoi n'acceptez-vous pas les réponses, OP? – Roman

Répondre

2

C'est simple et rapide (en supposant une table et hash sont des tableaux numpy.uint32):

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

Vous pouvez comparer la vitesse avec ceci:

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

par ailleurs, numpy.insert ne fait pas la même chose que pour-lo op vous avez posté.

+0

Tout à fait raison, j'utilisais insert quand je voulais utiliser put (ce qui équivaut à votre tâche de découpage.) Vous l'avez. – user213060

Questions connexes