Я пытаюсь думать о том, как API Python может искать большие хранилища данных, такие как Cassandra. R, Matlab и NumPy имеют тенденцию использовать формулировку «все является матрицей» и выполнять каждую операцию отдельно. Эта модель доказала свою эффективность для данных, которые могут вписываться в память. Однако одним из преимуществ SAS для больших данных является то, что он выполняется по строкам, делая все вычисления строк перед переходом к следующему. Для такого хранилища данных, как Cassandra, эта модель кажется огромной победой - мы только циклически просматриваем данные один раз.Отложенное выполнение в python для больших данных
В Python подход SAS может выглядеть примерно так: (? Тоже)
with load('datastore') as data:
for row in rows(data):
row.logincome = row.log(income)
row.rich = "Rich" if row.income > 100000 else "Poor"
Это явное, но имеет то преимущество, что только один раз зацикливание. Для меньших наборов данных производительность будет очень низкой по сравнению с NumPy, потому что функции не векторизуются с использованием скомпилированного кода. В R/Numpy мы имели бы гораздо более краткие и составили:
data.logincome = log(data.income)
data.rich = ifelse(data.income > 100000, "Rich", Poor")
Это будет выполнять очень быстро, потому что log
и ifelse
оба скомпилированные функции, что оператор на векторах. Однако недостатком является то, что мы будем дважды зацикливаться. Для небольших наборов данных это не имеет значения, но для поддерживаемого Cassandra хранилища данных я не вижу, как работает этот подход.
Вопрос: Есть ли способ сохранить второй API (например, R/Numpy/Matlab), но задержать вычисление. Возможно, вызывая функцию синхронизации (данных) в конце?
Альтернативные идеи? Было бы неплохо поддерживать синтаксис типа NumPy, поскольку пользователи будут использовать NumPy для небольших операций и будут иметь интуитивное понимание того, как это работает.
Я не уверен, что полностью слежу за тем, что вы пытаетесь сделать. Как это улучшается по сравнению с моей первой опцией, которая просто перебирает строки, где строки представляют собой представление на базовые данные? – Tristan
Ну, для одного это подтверждает необходимость петли верхнего уровня. С другой стороны, я подумал, что одна из ваших проблем заключалась в том, чтобы обработать код из тела цикла и в отдельных функциях (вы говорили о преимуществе «скомпилированных функций», хотя я не уверен, насколько это имеет смысл в Python, но это имеет большой смысл, если вы подумываете о том, чтобы вывести эти функции на C-код позже). Третьей задачей был аккуратный API для функций обработки. Учитывая эти ограничения, я думал, что этот подход производителей-потребителей является хорошим компромиссом. Но YMMV. – ThomasH