Более высокопроизводительный метод делает этот тип вставки из Python? - PullRequest
1 голос
/ 15 декабря 2009

Учитывая два массива hashes и table, для каждого значения в hashes Я хочу сохранить позицию элемента со смещением значения элемента в массиве table. Вот наивный алгоритм:

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

Это очень медленно. Псико помогает здесь некоторым, но вряд ли.

У Numpy есть решение:

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

Но, согласно моим оценкам, это все равно очень медленно для такой простой операции. Есть ли более быстрый способ выполнить это, который можно использовать из python?

Некоторые дополнительные примеры кода:

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

1 Ответ

2 голосов
/ 15 декабря 2009

Это быстро и просто (при условии, что таблица и хэши являются массивами numpy.uint32):

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

Вы можете сравнить скорость с этим:

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

Кстати, numpy.insert не делает то же самое, что и цикл for, который вы опубликовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...