Я пытаюсь подумать о том, как Python API может выглядеть для больших хранилищ данных, таких как Cassandra. R, Matlab и NumPy, как правило, используют формулировку «все является матрицей» и выполняют каждую операцию отдельно. Эта модель доказала свою эффективность для данных, которые могут поместиться в памяти. Однако одно из преимуществ SAS для больших данных заключается в том, что он выполняет строку за строкой, выполняя все вычисления строки перед переходом к следующей. Для такого хранилища данных, как Cassandra, эта модель кажется огромной победой - мы только один раз перебираем данные.
В 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 для небольших операций и будут интуитивно понимать, как это работает.