Документация Engee

Сравнение Symbolics.jl в Julia с SymPy для символьных вычислений

Symbolics.jl — это язык символьного моделирования для Julia, написанный на Julia. Его цель существенно отличается от назначения Sympy: он был создан для поддержки символьно-числовых вычислений, сочетания символьных вычислений с численными методами для обеспечения экстремальной производительности вычислений, которая была бы невозможна без изменения модели. Поэтому Symbolics.jl выделяется во многих областях за счет целенаправленных проектных решений.

  • Производительность. Symbolics.jl написан на Julia, тогда как SymPy был написан на Python. Таким образом, планка производительности для Symbolics.jl гораздо выше. Symbolics.jl был создан потому, что SymPy работал слишком медленно, а библиотека SymEngine была слишком негибкой для проектов, где они использовались. В Symbolics.jl производительность играет первостепенную роль. Если вы обнаружите какие-либо проблемы с производительностью, сообщите об этом.

  • build_function: некоторым пользователям достаточно функции lambdify, но если вы создаете супербыстрый MPI-совместимый код моделирования на Julia/C/Fortran, наличие функции, которая обращается к интерпретатору Python, будет менее чем оптимальным. По умолчанию build_function создает быстрые JIT-компилированные функции благодаря тому, что находится в Julia. Однако в нем есть поддержка таких вещей, как статические массивы , функции без выделений за счет изменения, быстрые функции для разреженных матриц и массивов массивов и т. д.: все основные компоненты для высокопроизводительных вычислений.

  • Параллелизм. Symbolics.jl обладает повсеместным параллелизмом. Символьное упрощение с помощью SymbolicUtils.jl характеризуется встроенным параллелизмом, Symbolics.jl создает функции, которые распараллеливаются в потоках. Symbolics.jl совместим с библиотеками GPU, такими как CUDA.jl.

  • Расширяемость. Symbolics.jl и лежащие в его основе инструменты написаны на чистом языке Julia. Хотите добавить новые или улучшенные правила упрощения? Добавьте код Julia. Нужно добавить новые производные? Добавьте код Julia. Вы поняли, как это работает. Разрушение этих барьеров помогает пользователю настроить программу в соответствии с имеющимися потребностями и ускоряет разработку библиотеки.

  • Глубокая интеграция с экосистемой Julia. Интеграция Symbolics.jl с нейронными сетями — не единственное, что реализовано с достойной продуманностью. Symbolics.jl создан в соответствии с той же философией, что и другие пакеты SciML, с отказом от единого репозитория в пользу распределенного подхода к разработке, который объединяет труд многих разработчиков. Части дифференцирования используют инструменты из библиотек автоматического дифференцирования, источником всей функциональности линейной алгебры является трассировка Julia Base, символьная перезапись (упрощение и подстановка) происходит из SymbolicUtils.jl, параллелизм происходит из библиотек Julia Base, Dagger.jl и т. д. Инструменты SiML, такие как DataDrivenDiffEq.jl, могут восстанавливать символьные выражения из нейронных сетей и данных, а NeuralPDE.jl может автоматически решать дифференциальные уравнения в частных производных на основе символьных описаний, используя нейронные сети, поддерживающие физику. Список можно продолжить. В общем, согласно замыслу, разработка Symbolics.jl ведется быстро, так как при этом эффективно используется труд сотен разработчиков Julia, что способствует динамичному развитию языка.

  • Хотя Symbolics.jl обладает многими возможностями, отсутствующими в SymPy, он не заменяет функциональность SymPy. Список отсутствующих возможностей см. в описании этой проблемы.