Подтвердить что ты не робот

Быстрый путь к объектам Hash Numpy для кэширования

Реализация системы, когда, когда дело доходит до тяжелого математического подъема, я хочу сделать как можно меньше.

Я знаю, что есть проблемы с memoisation с numpy-объектами, и, как таковой, реализовал кэш с ленивым ключом, чтобы избежать всего аргумента "Преждевременная оптимизация".

def magic(numpyarg,intarg):
    key = str(numpyarg)+str(intarg)

    try:
        ret = self._cache[key]
        return ret
    except:
        pass

    ... here be dragons ...
    self._cache[key]=value
    return value

но поскольку преобразование строк занимает довольно много времени...

t=timeit.Timer("str(a)","import numpy;a=numpy.random.rand(10,10)")
t.timeit(number=100000)/100000 = 0.00132s/call

Что люди считают "лучшим способом" для этого?

4b9b3361

Ответ 1

Заимствован из этого ответа... так что я думаю, что это дубликат:

>>> import hashlib
>>> import numpy
>>> a = numpy.random.rand(10, 100)
>>> b = a.view(numpy.uint8)
>>> hashlib.sha1(b).hexdigest()
'15c61fba5c969e5ed12cee619551881be908f11b'
>>> t=timeit.Timer("hashlib.sha1(a.view(numpy.uint8)).hexdigest()", 
                   "import hashlib;import numpy;a=numpy.random.rand(10,10)") 
>>> t.timeit(number=10000)/10000
2.5790500640869139e-05

Ответ 2

Существует пакет для joblib. Найдите этот вопрос.

Ответ 3

Для небольших массивов numpy это также может быть полезно:

tuple(map(float, a))

если a - массив numpy.