gpt4 book ai didi

python - numpy 数组哈希的最有效属性

转载 作者:行者123 更新时间:2023-12-05 07:57:27 24 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/27202158/

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