На чем писать back-end, в котором много математики?

Есть идея одного сервиса, бэкэнд которого будет считать довольно много математики по весьма объемным данным (статистика, fft, свертки, обработка звука и изображений, возможно немного распознавания и всё такое). Собственно вопрос - какой выбрать язык?
Некоторое время назад я узнал про NumPy, и он мне очень понравился. В этой связи, конечно же, возникла идея выбрать Питон. Масла в огонь подлил один опытный товарищ, который сказал что-то типа "да сейчас весь веб нужно делать на Питоне" (мысленно сделаю скидку на его личные симпатии).

Но потом мне попалась на глаза статья, из которой следует, что Python в среднем на порядок(!) медленнее, чем Go. Это сильно поколебало моё мнение. 2-3 раза можно было бы простить, но порядок - это очень серьезный повод задуматься. Сервера-то недешевые.

И вот я подумал, что может поступить иначе - основную часть бэкэнда тупо на PHP (проще и дешевле), а самые критичные и математичные места на Go?

С другой стороны, я читал, что вроде бы NumPy внутри реализован на C++, а питоновый там только интерфейс? Если так, что тесты в вышеприведенной статье могут быть непоказательны в данном случае?

И чтоб в два раза не вставать - существуют ли библиотеки, подобные NumPy для PHP, Go и пр? Чтобы похожая идеология, количество функций и так далее. Конечно, быстрее всего будет работать что-то нативное на C++ (типа FFTW), но что-то не хочется возиться с большим зоопарком разрозненных библиотек в попытках их подружить. Хочется один швейцарский ножик.
  • Вопрос задан
  • 3835 просмотров
Пригласить эксперта
Ответы на вопрос 10
@nirvimel
Python для вычислений медленный!? Вы просто не умеете его готовить!
Я уже писал тут, что питон только сверху динамически типизированный скрипт (что необходимо для скорости разработки), но векторные вычисления numpy выполняются на самом железе, то есть так, что вы не напишите это на C/C++ быстрее чем на несколько процентов.
Кроме того, для тех случаев, когда векторных вычислений не хватает, существует Cython, это такой же компилируемый (и не уступающий в производительности) как C/C++ язык, с прямым доступом к питоновым объектом, передаваемым из скрипта.

статистика, fft, свертки, обработка звука и изображений, возможно немного распознавания

Все это реализуется через векторные вычисления или через соответствующие библиотеки, которые тоже не на скрипте написаны и которые не уступят в производительности идеальному решению более чем на несколько процентов. Если даже для какой-то отдельной задачи не найдется готового решения в виде библиотеки, то всегда остается вариант сделать эту мелочь на Cython.
Ответ написан
@Arik
Напишите все на чем быстрее получится, посмотрите на нагрузку сервера, какие части ПО нагружают и это быстренько поправьте. А так завтра прочитаете что ассемблер, или еще что, делает все языки вместе взятые и опять начнете переписывать. А так у вас хотя бы есть рабочий вариант какой никакой и в сжатые сроки. Может и не нужно будет ничего переписывать, у меня такое часто бывает.
Ответ написан
Комментировать
s0ci0pat
@s0ci0pat
I'm Awesome
На C++, а лучше на C. Мы так и делаем.
Ответ написан
Комментировать
@lega
Статью не читал, я бы взял python для всего (веба) и c++ для математики.
Го для сетевых задач, в математике* он уступает с++
Ответ написан
@best_santa
С++ на узкие места, всё остальное, на чем удобней.
Ответ написан
Olej
@Olej
инженер, программист, преподаватель
из которой следует, что Python в среднем на порядок(!) медленнее, чем Go.

Ну, слухи по порядок сильно преувеличены. ;-)
На самом деле там 2 порядка (Python2) или больше (Python3).

Тут кто-то советовал:
На C++, а лучше на C. Мы так и делаем.

"Мы так делаем" - это, конечно, сильный аргумент ... , но Go не медленнее C/C++, ... ну, на некоторых типах задач медленнее до 2-х раз.
Ответ написан
Предметную область по цифровой обработке сигналов лучше писать на высокопроизводительных языках, собирая в библиотеки. Затем из любого веб-фреймворка, скажем на Python, можно работать с библиотечными вызовами.
В целом, для back-end подходят Fortran/Go/Java. На Fortran пишут, в основном, бородатые дядечки. А Go/Java - для нынешнего поколения.
В качестве эксперимента могу предложить ещё язык Julia, который согласно разработчикам имеет скорость близкую к C. Причём этот язык под капотом использует вызовы к математическим библиотекам: FFTW, LAPACK, OpenBLAS, GMP и т.д.
Ответ написан
Комментировать
un1t
@un1t
Действительно, если использовать numpy или другие библиотеки написанные на сях, то на Go у вас написать быстрее не получится. Вопрос в том сколько вашей логики укладывается в эти сишные либы.
Тут пацаны пишут, что теперь можно писать модули для питона на Go!
stackoverflow.com/questions/12443203/writing-a-pyt...

Т.е. медленные участки кода вы сможете переписать на Go.
Ответ написан
@potan
Функциональный программист
Я рекомендую посмотреть Julia. Язык сравним с матлабом в плане математики, и мощнее питона как общего назначения.
Ответ написан
Комментировать
AterCattus
@AterCattus
Люблю быстрый backend
Если Go тут просто как один из вариантов (причем языка не знаете) - не выбирайте его. Если же знаете и нравится - берите его, как прекрасное решение для реализации backend демонов, а самые cpu-bound вещи через cgo, реализовав на C++.
Хотя вот у меня есть на Go вещица, считающая как раз FFT и около этого, так мне вполне хватило скорости самого Go. Вопрос лишь, какая у вас нагрузка и требования: мне +/- 2мс на запрос в данном случае роли не играли.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы