<p>根据需要生成多少个新密钥和旧密钥,很难说什么是最佳的。但使用您的逻辑,以下步骤应该相当快:</p>
<pre><code>import collections
import hashlib
_key = 0
def _get_new_key():
global _key
_key += 1
return _key
attributes = collections.defaultdict(_get_new_key)
def get_cell_id(series):
global attributes
return attributes[hashlib.md5(series.tostring()).digest()]
</code></pre>
<p><strong>编辑:</strong></p>
<p>现在,我更新了根据您的问题循环所有数据系列的步骤:</p>
^{pr2}$
<p>上面每个元素数组执行256x256查找/分配。
当然不能保证md5哈希不会发生冲突。如果这是一个问题,当然可以更改为同一库中的其他哈希。在</p>
<p><strong>编辑2:</strong></p>
<p>鉴于您似乎要在3D阵列的第一个轴上执行大多数昂贵的操作,我建议您重新组织阵列:</p>
<pre><code>In [254]: A2 = np.random.random((256, 256, 30))
In [255]: A2_strided = np.lib.stride_tricks.as_strided(A2, (A2.shape[0] * A2.shape[1], A2.shape[2]), (A2.itemsize * A2.shape[2], A2.itemsize))
In [256]: %timeit tuple(get_cell_id(S) for S in A2_strided)
10 loops, best of 3: 126 ms per loop
</code></pre>
<p>不必在内存中长距离跳转大约可以提高25%的速度</p>
<p><strong>编辑3:</strong></p>
<p>如果实际上不需要缓存一个散列来查找<code>int</code>,但您只需要实际的散列,并且如果3D数组是<code>int8</code>-类型,那么给定<code>A2</code>和{<cd4>}组织,时间可以再减少一些。这15毫秒中有元组循环。在</p>
<pre><code>In [9]: from hashlib import md5
In [10]: %timeit tuple(md5(series.tostring()).digest() for series in A2_strided)
10 loops, best of 3: 72.2 ms per loop
</code></pre>