为了缓存目的, 我需要能够将一个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
提供了最佳性能。
虽然对只读缓冲区进行哈希运算本身很快,但设置可写标志的开销实际上使其变慢了。
arr.tostring()
执行相同的操作,而且更美观。如果您有非常大的数组,可以尝试仅将数组的一小部分字符串化。 - roottostring
看起来对于小型数组的速度快了几个数量级(虽然在有 10000 个元素的数组中慢了 4 倍)。 - Fred Foostr
只会格式化数组的开头和结尾。 - Fred Foostr(arr.data)
是错误的?我在不同的数组上使用它,得到了相同的字符串...!? - Make42