Быстрый способ хэширования объектов Numpy для кэширования - PullRequest
19 голосов
/ 22 марта 2011

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

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

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

Что люди считают «лучшим способом» сделать это?

Ответы [ 3 ]

23 голосов
/ 22 марта 2011

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

>>> 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
4 голосов
/ 22 марта 2011

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

2 голосов
/ 05 августа 2014

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

tuple(map(float, a))

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

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