我有一个相当大的数据集,我存储在 HDF5 中并使用 PyTables 访问。我需要在这个数据集上做的一个操作是每个元素之间的成对比较。这需要 2 个循环,一个循环遍历每个元素,一个内部循环遍历所有其他元素。因此,该操作着眼于 N(N-1)/2 次比较。
对于相当小的集合,我发现将内容转储到多维 numpy 数组中然后进行迭代会更快。由于内存问题,我遇到了大型集合的问题,并且需要在运行时访问数据集的每个元素。
将元素放入数组中,我每秒可以进行大约 600 次比较,而对 hdf5 数据本身进行操作,每秒可以进行大约 300 次比较。
有没有办法加快这个过程?
示例如下(这不是我的真实代码,只是一个示例):
小套装:
with tb.openFile(h5_file, 'r') as f:
data = f.root.data
N_elements = len(data)
elements = np.empty((N_elements, 1e5))
for ii, d in enumerate(data):
elements[ii] = data['element']
D = np.empty((N_elements, N_elements))
for ii in xrange(N_elements):
for jj in xrange(ii+1, N_elements):
D[ii, jj] = compare(elements[ii], elements[jj])
大套装:
with tb.openFile(h5_file, 'r') as f:
data = f.root.data
N_elements = len(data)
D = np.empty((N_elements, N_elements))
for ii in xrange(N_elements):
for jj in xrange(ii+1, N_elements):
D[ii, jj] = compare(data['element'][ii], data['element'][jj])