У меня есть довольно большой набор данных, который я храню в HDF5 и доступ с помощью PyTables. Одной операцией, которую мне нужно сделать в этом наборе данных, является попарное сравнение между каждым из элементов. Для этого требуется 2 цикла, один для итерации по каждому элементу и внутренний цикл для итерации по каждому другому элементу. Таким образом, эта операция рассматривает сравнения N (N-1)/2.Вложенная итерация HDF5 с использованием PyTables
Для довольно небольших наборов я обнаружил, что быстрее выгружать содержимое в многомерный массив numpy и выполнять мою итерацию. Я сталкиваюсь с проблемами с большими наборами из-за проблем с памятью и должен получить доступ к каждому элементу набора данных во время выполнения.
Ввод элементов в массив дает мне около 600 сравнений в секунду, а сама работа с данными hdf5 дает мне около 300 сравнений в секунду.
Есть ли способ ускорить этот процесс?
Пример следующим образом (это не мой реальный код, просто пример):
Small Set:
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])
Благодаря Торстен. Раньше я пробовал код профилирования, но, честно говоря, у меня были проблемы с интерпретацией результатов. Я попробую снова.Но я чувствую, что узкое место не должно иметь ничего общего с функцией сравнения, так как это делает то же самое на малых и больших реализациях. Это как-то связано с тем, как PyTables обращается к элементам. Кроме того, вы видите шанс уменьшить из O (n^2)? Каждый элемент уникален, поэтому я не вижу, как его можно улучшить, чем это, но я мог бы что-то упустить. – dvreed77