Эффективный расчет полных столбцов (pytables, hdf5, numpy)

У меня есть простой файл HDF5 (созданный PyTables) с десятью столбцами и 100000 строк. Для каждого значения я должен применить простое линейное уравнение с разными параметрами для каждого столбца и записать материал в CSV.

Мой наивный подход состоял в том, чтобы зациклиться на таблице:

for row in table.iterrows():
    print "%f,%f,..." % (row['a'] * 1.0 + 2.0, row['b'] * 3.0 + 4.0, ...)

Но мне интересно, будет ли более эффективно выбирать столбцы и вычислять их таким образом, а затем перебирать полученные массивы:

a = numpy.add(numpy.multiply(table.cols.a, 1.0), 2.0)
b = numpy.add(numpy.multiply(table.cols.b, 3.0), 4.0)

Но это еще медленнее, кажется.

Как лучше всего это сделать?


person Community    schedule 01.09.2014    source источник


Ответы (1)


Ваша производительность, скорее всего, будет ограничена записью в CSV, но в остальном эта проблема заключается именно в том, что numexpr был создан для.

Вы можете использовать метод Expr.set_output для записи результата обратно в hdf5 вместо повторения результата и записи в CSV напрямую, а затем искать более эффективный метод преобразования этого столбца результатов в CSV в одном оптимизированном вызове; или найти способ вообще отказаться от CSV, потому что нет особого смысла использовать его, если производительность действительно является серьезной проблемой.

person Eelco Hoogendoorn    schedule 01.09.2014
comment
Большое спасибо, как новичок в PyTables, я никогда раньше не слышал об этой функции. При быстрой проверке это примерно на треть быстрее (~ 400 мс), чем при использовании iterrows (~ 600 мс)! Прохладный! (Подход numpy настолько медленный, что я прервал его через несколько минут.) - person ; 02.09.2014