Как сравнить Rpy2, pyrserve и PypeR?
Я хотел бы получить доступ к R из программы Python. Мне известны Rpy2, pyrserve и PypeR.
Каковы преимущества или недостатки этих трех вариантов?
4 ответа
Я знаю одну из 3 лучше других, но в порядке, указанном в вопросе:
rpy2:
- Интерфейс уровня C между Python и R (R работает как встроенный процесс)
- R объектов, представленных Python без необходимости копировать данные поверх
- И наоборот, массивы Python могут быть выставлены на R без копирования
- Низкоуровневый интерфейс (близкий к R C-API) и высокоуровневый интерфейс (для удобства)
- Возможна модификация на месте для векторов и массивов
- Функции обратного вызова R могут быть реализованы в Python
- Можно иметь анонимные R-объекты с меткой Python
- Возможно травление питона
- Полная настройка поведения R с помощью его консоли (так что возможно реализовать полный R GUI)
- MSWindows с ограниченной поддержкой
pyrserve:
- нативный код Python (будет / должен / может работать с CPython, Jython, IronPython)
- использовать R's Rserve
- преимущества и неудобства, связанные с удаленными вычислениями и RServe
Пайпер:
- нативный код Python (будет / должен / может работать с CPython, Jython, IronPython)
- использование каналов для связи Python с R (с преимуществами и неудобствами, связанными с этим)
edit: поддержка Windows для rpy2
Из статьи в журнале статистического программного обеспечения на PypeR:
RPy представляет простой и эффективный способ доступа к R из Python. Он надежен и очень удобен для частых операций взаимодействия между Python и R. Этот пакет позволяет программам Python передавать объекты Python базовых типов данных в функции R и возвращать результаты в объектах Python. Такие особенности делают его привлекательным решением для случаев, когда Python и R часто взаимодействуют. Тем не менее, существуют ограничения этого пакета, перечисленные ниже.
Спектакль:
RPy может работать не очень хорошо для больших массивов данных или для задач, требующих больших вычислительных ресурсов. Много времени и памяти неизбежно расходуется при создании копии данных R на языке Python, поскольку RPy в каждом раунде диалога преобразует возвращаемое значение выражения R в объект Python базовых типов или массив NumPy. RPy2, недавно разработанная ветвь RPy, использует объекты Python для ссылки на объекты R вместо того, чтобы копировать их обратно в объекты Python. Эта стратегия позволяет избежать частых преобразований данных и повышает скорость. Тем не менее, потребление памяти остается проблемой. [...] Когда мы внедряли WebArray (Xia et al. 2005), онлайн-платформу для анализа микрочипов, задание потребляло примерно на четверть больше вычислительного времени при запуске R через RPy, а не через пользовательский интерфейс командной строки R. Поэтому мы решили запустить R в Python через каналы в последующих разработках, например, WebArrayDB (Xia et al. 2009), которые сохранили ту же производительность, что и при независимой работе R. Мы не знаем точной причины такой разницы в производительности, но мы заметили, что RPy напрямую использует общую библиотеку R для запуска сценариев R. Напротив, запуск R через каналы означает непосредственный запуск интерпретатора R.
Объем памяти:
R был осужден за неэкономичное использование памяти. Память, используемая объектами R большого размера, редко удаляется после удаления этих объектов. Иногда единственный способ освободить память из R - это выйти из R. Модуль RPy оборачивает R в объект Python. Однако библиотека R останется в памяти, даже если объект Python будет удален. Другими словами, память, используемая R, не может быть освобождена до тех пор, пока скрипт Python хоста не будет завершен.
Переносимость:
Как модуль с расширениями, написанными на C, исходный пакет RPy должен быть скомпилирован с определенной версией R в системах POSIX (Portable Operating System Interface для Unix), а R должен быть скомпилирован с включенной общей библиотекой. Кроме того, бинарные дистрибутивы для Windows связаны с определенными комбинациями различных версий Python/R, поэтому у пользователя довольно часто возникают трудности с поиском дистрибутива, который соответствует его программной среде.
С точки зрения разработчика, мы использовали rpy/rpy2 для предоставления статистических функций и функций рисования для нашего приложения на основе Python. Это вызвало огромные проблемы с доставкой нашего приложения, потому что rpy/rpy2 должен быть скомпилирован для конкретных комбинаций Python и R, что делает невозможным предоставление бинарных дистрибутивов, которые работают "из коробки", если только мы не объединяем R. Поскольку rpy/rpy2 не особенно просты в установке, мы закончили замену соответствующих частей собственными модулями Python, такими как matplotlib. Мы бы переключились на pyrserve, если бы нам пришлось использовать R, потому что мы могли бы запускать R-сервер локально и подключаться к нему, не беспокоясь о версии R.
В Pyper я не могу передать большую матрицу из Python в R экземпляр с помощью assign(). Тем не менее, у меня нет проблем с rpy2. это просто мой опыт.