Potrzebuję być w stanie przechowywać numpy
array
w dict
dla celów buforowania. Szybkość skrótu jest ważna.Najbardziej wydajna właściwość do mieszania dla numpy array
Oznaczenie array
oznacza, że podczas gdy rzeczywista tożsamość obiektu nie jest ważna, wartość jest. Mutabliity nie jest problemem, ponieważ interesuje mnie tylko obecna wartość.
Co powinienem użyć, aby go zapisać w numerze dict
?
Moje obecne podejście polega na użyciu str(arr.data)
, która jest szybsza niż md5
w moich testach.
mam włączone kilka przykładów z odpowiedziami, aby zorientować razy względna:
In [121]: %timeit hash(str(y))
10000 loops, best of 3: 68.7 us per loop
In [122]: %timeit hash(y.tostring())
1000000 loops, best of 3: 383 ns per loop
In [123]: %timeit hash(str(y.data))
1000000 loops, best of 3: 543 ns per loop
In [124]: %timeit y.flags.writeable = False ; hash(y.data)
1000000 loops, best of 3: 1.15 us per loop
In [125]: %timeit hash((b*y).sum())
100000 loops, best of 3: 8.12 us per loop
Wydaje się, że w tym konkretnym przypadku (małe tablice indeksów), arr.tostring
oferuje najlepsza wydajność.
Podczas mieszania bufor tylko do odczytu jest szybki sam, obciążenie związane z ustawianiem flagi zapisu powoduje jej spowolnienie.
'arr.tostring()' robi to samo i jest bardziej estetyczne. Jeśli masz naprawdę duże tablice, możesz spróbować ułożyć tylko małą część tablicy. – root
'tostring' również wydaje się być o rząd wielkości szybszy dla małych tablic (choć 4 × wolniej dla tablicy 10000 elementów). –
... co jest całkiem oczywiste, ponieważ 'str' formatuje tylko głowę i ogon tablicy. –