我需要能够存储一个 numpy
array
在一个 dict
缓存的目的。散列速度很重要。
array
表示索引,因此尽管对象的实际标识并不重要,但其值却很重要。可变性不是问题,因为我只对当前值感兴趣。
为了在 dict
中存储它,我应该散列什么?
我目前的方法是使用 str(arr.data)
,在我的测试中它比 md5
快。
为了了解相对时间,我引用了一些答案中的例子:
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
看起来,对于这个特定的用例(索引的小数组) ,arr.tostring
提供了最好的性能。
虽然散列只读缓冲区本身就很快,但是设置可写标志的开销实际上使它变慢了。