От Python к Scala и C++

Благодаря PyPy мой код стал выполняться в 1.7 раз быстрее, но этого мне было не достаточно. Дальше я решил попробовать переписать парсер на Scala. Скала имеет статическую типизацию и компилируется в Явовский байт-код. Посмотрев тесты производительности я узнал, что Scala в 10 раз быстрее Питона и совсем чуть-чуть медленее чем C++. Конечно в это не очень верилось, но и с плюсами копаться не хотелось.

И вот я переписал код на Scala.

Python 7 мин 40 сек
PyPy 3 ммн 58 сек
Scala 4 мин 20 сек

Результаты скажем прямо меня не порадовали. Скала конечно быстрее CPython, но ведь это даже медленнее чем PyPy. Как вообще такое может быть, язык с динамической типизацией делает, язык со статической типизацией.

Вобщем я был в печали, но делать оставалось не чего, надо было выжимать максимум и я взял в руки С++.
Результат.
C++ 47 сек.

Вот это да! Вот это я понимаю, это реально быстро. 1,5Гб — файл разбирается за 47 секунд.

Однако копание в плюсах навело меня на следующую мысль. В плюсах я не использовал никакие высокоуровневые штуки для парсинга XML, лишь обычные строковые операции. А в Скале какую-то штуку для парсинга XML, а в Питоне регулярки. Получается тест не совсем честный, т.к. алгоритмы разные.

Я вернулся в Скалу и переписал код оставив только стандартные операции со строками.
И результат просто охренителен:
Scala 57 сек

Действительно почти также быстро как в плюсах.

Может реально вся проблема в алгоритме?

После этого я уже не мог не вернуться к Питону, чтобы выкинуть отуда все регулярки и узнать насколько же быстро может он парсить файлы.
Результаты:
CPython 4 мин 12 сек
PyPy 2 мин 48 сек

Да это в два раза лучше начальных результатов, но успех не такой громкий как в Скале.

Окончательные результаты:

CPython 4 мин 12 сек
PyPy 2 мин 48 сек
Scala 57 сек
C++ 47 сек.

Победитель — С++. А кто бы сомневался. Однако Scala настолько близка к плюсам по скорости, что это просто увидительно. Я еще окончательно не решил на каком языке теперь уже полностью перепишу парсер, пока склонаюсь к Scala.