为numpy数组哈希的最有效属性

发布于 2021-01-29 15:56:51

我需要能够将A存储numpy arraydict缓存中。哈希速度很重要。

array代表indicies,所以在对象的真实身份并不重要,值。交互性不是问题,因为我只对当前值感兴趣。

为了将其存储在中,我应该哈希什么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提供了最佳性能。

尽管对只读缓冲区进行散列操作本身很快,但是设置可写标志的开销实际上使其变慢了。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果将其设为只读,则可以简单地对基础缓冲区进行哈希处理:

    >>> a = random.randint(10, 100, 100000)
    >>> a.flags.writeable = False
    >>> %timeit hash(a.data)
    100 loops, best of 3: 2.01 ms per loop
    >>> %timeit hash(a.tostring())
    100 loops, best of 3: 2.28 ms per loop
    

    对于非常大的阵列,hash(str(a))速度要快得多,但随后只考虑了阵列的一小部分。

    >>> %timeit hash(str(a))
    10000 loops, best of 3: 55.5 us per loop
    >>> str(a)
    '[63 30 33 ..., 96 25 60]'
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看