Несколько лет назад я решил проблему с помощью динамического программирования:
https://www.thanassis.space/fillupDVD.html
Решение было закодировано в Python.
В рамках расширения моих горизонтов я недавно начал изучать OCaml/F #. Какой лучший способ проверить воды, чем сделать прямой порт императивного кода, который я написал в Python, чтобы F # - и начать оттуда, продвигаясь к функциональному программному решению.
Результаты этого первого, прямого порта... обескураживают:
В Python:
bash$ time python fitToSize.py
....
real 0m1.482s
user 0m1.413s
sys 0m0.067s
В FSharp:
bash$ time mono ./fitToSize.exe
....
real 0m2.235s
user 0m2.427s
sys 0m0.063s
(в случае, если вы заметили "моно" выше: я тестировал и под Windows, с Visual Studio - с той же скоростью).
Я... озадачен, мягко говоря. Python выполняет код быстрее, чем F #? Скомпилированный двоичный файл, использующий среду выполнения .NET, запускает SLOWER, чем интерпретируемый код Python?!?!
Я знаю о затратах на запуск виртуальных машин (в данном случае - моно) и о том, как JIT улучшают вещи для таких языков, как Python, но все же... Я ожидал ускорения, а не замедления!
Я сделал что-то неправильно, возможно?
Я загрузил код здесь:
https://www.thanassis.space/fsharp.slower.than.python.tar.gz
Обратите внимание, что код F # является более или менее прямым, поэтапным переводом кода Python.
P.S. Конечно, есть и другие преимущества, например. безопасность статического типа, предлагаемая F #, но если результирующая скорость императивного алгоритма хуже при F #... Я разочарован, мягко говоря.
РЕДАКТИРОВАТЬ: прямой доступ, как указано в комментариях:
код Python: https://gist.github.com/950697
код FSharp: https://gist.github.com/950699