多年前,我通过动态规划解决了一个问题:
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
(如果你注意到上面的“mono”:我也在Windows下使用Visual Studio进行了测试,速度相同)。
我感到非常困惑。Python比F#运行代码更快?一个使用.NET运行时的编译二进制文件运行比Python的解释代码更慢?!
我知道虚拟机的启动成本(在这种情况下是mono)以及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
fsi.exe
和#time
计时)。然而,我没有尝试理解你的代码-如果您发布一些要优化的简单F#代码(因为不是每个人都想分析您的两个示例),那么您更有可能得到有用的答案。 - Tomas Petricek