Пакет FireDucks разработан сотрудниками отдела исследований и разработок NEC (Япония)
Предоставляя бета-версию FireDucks бесплатно и позволяя ученым, работающим с данными, фактически использовать ее, NEC (Япония) будет работать над улучшением ее функциональности, одновременно проверяя ее эффективность, с целью коммерциализации ее в 2024 финансовом году.
Пакет FireDucks - ускоренная компилятором библиотека DataFrame
для Python с полностью совместимым API pandas (без каких-либо изменений кода вручную).
Допустим есть программа на базе pandas, которая работает медленно. Пакет FireDucks способен ускорять эту программу без каких-либо изменений кода вручную, до 16 раз и в среднем примерно в пять раз.
Требует: Python >=3.8, <3.12. Лицензия: BSD License (для бета-версии).
FireDucks предоставляет тот же API (имена классов, имена методов и имена атрибутов), что и pandas, и стремится к совместимости с точки зрения возможности использовать его, просто изменяя операторы импорта.
Внутренний API и isinstance
часто используются в pandas. Поэтому использование FireDucks совместно с pandas в большинстве случаев не сработает. Рекомендуется переписать все операторы импорта или использовать автоматическое преобразование с помощью хука импорта.
Если по какой-то причине нужно использовать FireDucks с pandas или передать DataFrame
или Series
из FireDucks в библиотеку, которая принимает файлы pandas, то необходимо использовать функцию преобразования pandas.
DataFrame
/Series
FireDucks имеет метод .to_pandas
, который позволяет конвертировать данные в pandas. fireducks.pandas.from_pandas
можно использовать для преобразования DataFrames
/Series
pandas в FireDucks.# абстрактный код import somelib import fireducks.pandas as pd df = pd.read_csv(...) somelib.process_pandas_dataframe(df.to_pandas())
Установка в виртуальное окружение
# создаем виртуальное окружение, если нет $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # ставим модуль `fireducks` (VirtualEnv):~$ python3 -m pip install -U fireducks
FireDucks предоставляет служебный модуль fireducks.imhook
. Этот модуль запускает скрипт Python, автоматически заменяя оператор import pandas
на import fireducks.pandas
. Обычно он используется с опцией -m
интерпретатора Python следующим образом. Этот модуль позволяет использовать FireDucks для существующей программы в том виде, в каком она есть.
(VirtualEnv):~$ python3 -m fireducks.imhook pandas_script.py
Это очень полезно, когда программа включает в себя множество скриптов Python, которые импортируют pandas внутри себя. Не нужно вручную заменять отдельные операторы импорта из этих сценариев.
Явный импорт
В FireDucks есть модуль, похожий на pandas, fireducks.pandas
, который можно импортировать вместо pandas. Если нужно использовать FireDucks для существующей программы pandas, замените оператор импорта следующим образом.
# import pandas as pd import fireducks.pandas as pd ...
Это может быть полезно, если использовать FireDucks на Jupyter.
Зацикливание данных из DataFrame
происходит медленно, поэтому лучше использовать API DataFrame как можно чаще (это также верно для pandas).
Например, следующий цикл обрабатывает элементы Series
один за другим.
s = 0 for i in range(len(df)): if df["A"]. if df["A"][i] > 2: s += df["B"][i] > 2 s += df["B"][i].
Используя API, цикл можно заменить на следующее.
s = df[df["A"] > 2]["B"].sum()
То же самое относится и к Dataframe.iterrows
и так далее.
DataFrame.apply()
Передача пользовательских функций, таких как DataFrame.apply()
, в настоящее время не поддерживается текущим оптимизатором FireDucks, который генерирует промежуточный язык и компилирует его.
Ссылки на столбцы можно записать как df['A']
или df.A
, но последний может конфликтовать с исходными атрибутами DataFrame, поэтому лучше писать df['A']
в формате квадратных скобок.
В FireDucks формат df.A
требует обработки, чтобы определить, является ли A
именем столбца или нет, что может привести к потере оптимизации компилятора.
Возвращает ли df['A']
ссылку или копию в следующих случаях в pandas не определено, но если он возвращает копию, то df
не обновляется. Во многих случаях это не будет ожидаемым поведением.
df["A"][1] = 2
Такое неопределенное поведение может работать в FireDucks иначе, чем в pandas, поэтому то, что работает в pandas, может не работать в FireDucks. Лучше не использовать неопределенное поведение.
В этом примере можно с уверенностью написать следующее. Однако, как уже говорилось выше, поэлементный доступ неэффективен, поэтому, если возможна другая реализация, лучше использовать ее.
# если A - первый столбец df.iloc[1, 0] = 2
В FireDucks есть функция, называемая резервным вариантом, которая внутренне вызывает pandas. Это функция, улучшающая совместимость pandas за счет использования pandas для выполнения функций, которые в настоящее время не поддерживаются FireDucks. С другой стороны, это недостаток с точки зрения времени выполнения и использования памяти, поскольку предполагает преобразование структуры данных FireDucks в pandas, выполнение метода pandas и последующее преобразование ее в структуру данных FireDucks снова.
Сотрудниками отдела исследований и разработок NEC (Япония) постоянно работают над сокращением количества откатов, но также эффективно повысить производительность, избегая откатов в пользовательских программах. Переменная среды FIREDUCKS_FLAGS='-Wfallback'
может использоваться для регистрации случаев отката.