Как сравнить 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. это просто мой опыт.

Другие вопросы по тегам