gpt4 book ai didi

python - numpy数组散列的最有效属性

转载 作者:IT老高 更新时间:2023-10-28 20:34:28 25 4
gpt4 key购买 nike

我需要能够将 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 提供了最好的性能。

虽然散列只读缓冲区本身很快,但设置可写标志的开销实际上使其变慢。

最佳答案

如果将底层缓冲区设为只读,则可以简单地散列它:

>>> 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]'

关于python - numpy数组散列的最有效属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com