Devo essere in grado di memorizzare uno numpy
array
in un dict
per scopi di memorizzazione nella cache. La velocità hash è importante.Proprietà più efficiente dell'hash per l'array numpy
Il array
rappresenta gli indici, quindi mentre l'identità effettiva dell'oggetto non è importante, il valore è. La mutabilità non è una preoccupazione, perché sono interessato solo al valore attuale.
Cosa devo fare per memorizzarlo in un dict
?
Il mio approccio attuale è quello di utilizzare str(arr.data)
, che è più veloce di md5
nei miei test.
Ho incorporato alcuni esempi delle risposte per avere un'idea dei tempi relativi:
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
sembrerebbe che per questo particolare caso d'uso (piccoli array di indicies), offre la arr.tostring
la prestazione migliore.
Mentre l'hashing del buffer di sola lettura è veloce da solo, il sovraccarico dell'impostazione del flag scrivibile lo rende effettivamente più lento.
'arr.tostring()' fa lo stesso ed è più esteticamente gradevole. Se si dispone di array veramente grandi, è possibile provare a specificare solo una piccola parte dell'array. – root
Anche 'tostring' sembra essere più veloce in ordine di grandezza per i piccoli array (sebbene 4 volte più lento per un array di 10000 elementi). –
... che in realtà è abbastanza ovvio, perché 'str' formatta solo la testa e la coda dell'array. –