我已经采取了问题#12从项目欧拉作为编程锻炼和比较我的(肯定不是最优的)实现在C,Python和Erlang和Haskell的。为了获得更高的执行时间,我搜索的第一个三角形数的除数大于1000,而不是原始问题中所述的500。
结果如下:
C:
lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c
lorenzo@enzo:~/erlang$ time ./euler12.bin
842161320
real 0m11.074s
user 0m11.070s
sys 0m0.000s
蟒蛇:
lorenzo@enzo:~/erlang$ time ./euler12.py
842161320
real 1m16.632s
user 1m16.370s
sys 0m0.250s
带有PyPy的Python:
lorenzo@enzo:~/Downloads/pypy-c-jit-43780-b590cf6de419-linux64/bin$ time ./pypy /home/lorenzo/erlang/euler12.py
842161320
real 0m13.082s
user 0m13.050s
sys 0m0.020s
Erlang:
lorenzo@enzo:~/erlang$ erlc euler12.erl
lorenzo@enzo:~/erlang$ time erl -s euler12 solve
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> 842161320
real 0m48.259s
user 0m48.070s
sys 0m0.020s
Haskell:
lorenzo@enzo:~/erlang$ ghc euler12.hs -o euler12.hsx
[1 of 1] Compiling Main ( euler12.hs, euler12.o )
Linking euler12.hsx ...
lorenzo@enzo:~/erlang$ time ./euler12.hsx
842161320
real 2m37.326s
user 2m37.240s
sys 0m0.080s
摘要:
C:100%
Python:692%(使用PyPy时为118%)
Erlang:436%(135%感谢RichardC)
哈斯克尔:1421%
我认为C具有很大的优势,因为它使用long进行计算,而不使用其他任意三个整数。另外,它不需要先加载运行时(其他是否需要加载?)。
问题1: Erlang,Python和Haskell是否会由于使用任意长度的整数而失去速度,或者只要值小于,它们就不会丢失MAXINT吗?
问题2: 为什么Haskell这么慢?是否有编译器标志可以使您刹车,或者它是我的实现?(后者很有可能是因为Haskell是一本对我有七个印章的书。)
问题3: 能否为我提供一些提示,说明如何在不改变因素确定方式的情况下优化这些实现?以任何方式进行优化:对语言更好,更快,更“原生”。
编辑:
问题4: 我的函数实现是否允许LCO(最后一次调用优化,又称为尾部递归消除),从而避免在调用堆栈中添加不必要的帧?
尽管我不得不承认我的Haskell和Erlang知识非常有限,但我确实尝试过用四种语言尽可能地实现相同的算法。
喵喔喔
陪伴而非守候