Since I spirit people away from python and javascript, I thought I better have a look at whatever python is like now (I looked at it last around 2.7->3.0). Here is my attempt at a pythonic recursive factorial benchmark. ``` def fact(x,f): if x==0: return(f); else: return(fact(x-1,x*f)); ##The following single line seems to be part of function definition: pass; ## No longer in the function definition import timeit; timeit.timeit(stmt=lambda:fact(x=993,f=1),number=10000); ``` >29.585241416003555 Seconds, I imagine. Boy is that precise. With timeit, x>993 or without timeit, x>997 gave me ``` RecursionError: maximum recursion depth exceeded in comparison ``` and number=10000 let me run the benchmark in about 30 seconds. What about lisp? Disappointingly, ECL misses the tail recursion and stack depth tops out at x being 8879. ECL uses two kinds of compilation. 'compile does on-the-fly byte-compilation whereas 'compile-file rolls through $CC. The standard is a little nuanced on the topic. ``` (defun fact (x f) (if (zerop x) f (fact (1- x) (* x f)))) (time (dotimes (count 10000) (fact 993 1))) ``` real time : 23.190 secs run time : 27.590 secs gc count : 2500 times consed : 7437927024 bytes NIL ``` ...Kind of slow! Let's jump into sbcl for a second: ``` * (defun fact (x f) (if (zerop x) f (fact (1- x) (* x f)))) * (time (dotimes (count 10000) (fact 993 1))) Evaluation took: 2.545 seconds of real time 2.540000 seconds of total run time (2.440000 user, 0.100000 system) [ Run times consist of 0.276 seconds GC time, and 2.264 seconds non-GC time. ] 99.80% CPU 5,079,065,766 processor cycles 5,923,816,112 bytes consed NIL ``` Annoyingly, while the standard constrains what the 'time macro reports, it does not specify what the output will look like as you can see. Let's try ecl again. after running it through the default 'compile-file. ```ecl1.lisp (defun fact (x f) (if (zerop x) f (fact (1- x) (* x f)))) (time (dotimes (count 10000) (fact 993 1))) (si:quit) ``` ```ecl > (compile-file "ecl1.lisp" :load t) real time : 10.029 secs run time : 14.120 secs gc count : 2359 times consed : 6801762144 bytes ``` A little better! Still more than four times worse than sbcl. We can tell that the lisp compilers aren't cheating in the benchmark because the number of bytes consed (~allocated) looks consistent. POST SCRIPTUM I was going to bang on a lot here, but I guess that can be another phlog. If anyone wants to show me another python factorial definition/benchmark, please point me to your phlog (whether or no you're a pro). Lisp or another language either for that matter.