Несколько лет назад я решил проблему с помощью динамического программирования:
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, работает МЕДЛЕЕ, чем интерпретируемый код Python?!?!
Я знаю о затратах на запуск виртуальных машин (в данном случае моно) и о том, как JIT улучшают работу таких языков, как Python, но все же ... . Я ожидал ускорения, а не замедления!
Возможно, я сделал что-то не так?
Я загрузил код сюда:
https://www.thanassis.space/fsharp.slower.than. python.tar.gz
Обратите внимание, что код F # является более или менее прямым, построчным переводом кода Python.
PS Конечно, есть и другие преимущества, например безопасность статических типов, предлагаемая F #, но если результирующая скорость императивного алгоритма хуже в F # ... Я, мягко говоря, разочарован.
РЕДАКТИРОВАТЬ : Прямой доступ, как указано в комментариях:
код Python: https://gist.github.com/950697
код FSharp: https://gist.github.com/950699