Домашние задания: Математика

Во сколько раз Java быстрее Питона в математических вычислениях ?

Я , думаю, раз на 5000
Таня Байбарза
Таня Байбарза
3 422
А вот тут многое зависит от деталей. Сначала по лирике, потом — по физике. Что такое математические вычисления — уже вопрос, потому что вычислительная сложность численной оптимизации, графовых переборов, монте-карло симуляций и матричных разложений варьируется в зависимости от конкретной реализации конкретного алгоритма, версий языка и пакетов, которые он подгружает, а также банально мощности железа. Также было бы справедливо добавлять к времени выполнения кода также время его написания и отладки, но это уже философский, а не технический вопрос.

В качестве «референтной» математической операции я предлагаю выбрать умножение больших матриц. Это разумно, потому что
  1. алгоритмы умножения матриц не очень отличаются асимптотической сложностью (то есть не особо-то и важно, какой именно из них выбран: умножение по определению за O(n^3) или Штрассен за O(n^2.8))
  2. к матричному умножению сводится очень много других математических операций и вычислений, так что это в каком-то смысле «сердце» численных методов
  3. уже на такой простой задаче очень виден смысл происходящего и суть моего мнения по вопросу

Начнём вот с этой статейки на medium:
https://medium.com/swlh/a-performance-comparison-between-c-java-and-python-df3890545f6d
Автор по определению (через вложенный цикл) перемножает пару матриц размера 2048x2048 на Python, C и Java и получает результаты с прикрепленной картинки. Вывод: «ванильный» Python перемножает матрицы по определению в 33 раза медленнее, чем Java, и в 56 раз медленнее C.

Все — вопрос решён? А вот как бы не так: питоном пользуется очень много людей как в науке, так и в индустрии, особенно для математического моделирования и машинного обучения (уж где-где, а тут все держится на матричном умножении), так что в питоне есть библиотеки, оптимизирующие математические вычисления (NumPy и SciPy, например, которые фактически исполняют код на C, так что ускорение будет существенное). Можно даже постараться разобраться в соответствующих декораторах, но спортивное ускорение питона выходит за рамки вопроса.

Для иллюстрации посмотрим на эту статью:
https://martin-thoma.com/matrix-multiplication-python-java-cpp/
Автор перемножает матрицы 2000x2000 на Python, Java и C++ как по определению, так и с помощью библиотек. И выводы делает такие
  1. Ванильный Python — 56 минут, с библиотекой NumPy — 1 минута и 38 секунд
  2. Ванильная Java — 27 минут, с библиотекой JAMA — 1 минута и 36 секунд
  3. Ванильный C++ — 1 минута и 40 секунд

Моральный вывод: если использовать блага цивилизации в виде NumPy, SciPy, Torch и прочего, то Python перестаёт уступать по скорости другим языкам (а вот про удобство и простоту я говорить не стану — здесь точно найдутся питонохейтеры, так что злить их не буду)
АИ
Абдумалик Исмоилов
3 649
Лучший ответ
Абдумалик Исмоилов Дополнительный тест от меня лично, сделал только что на своём ноуте с i7 1165G7 в Jupiter. Я перемножал матрицы 500x500 четыре раза и суммарно получил такое время на Python:
  1. Ванильное умножение через цикл: 3 минуты и 20 секунд
  2. Через тензоры в Torch: 219 миллисекунд
  3. Через массивы в NumPy: 12 миллисекунд

Ясно, что с ростом размера матрицы разрыв может быть уже не в тысячи раз, а в десятки, но сути это не изменит
а тебе зачем сейчас это знать и пользоваться
(твои программы сейчас не требуют большой скорости) ?
Сергей Сергеев
Сергей Сергеев
88 352
ну хз, у меня питон вообще скорострел
Таня Байбарза Это assembly и C/C++