Op Tuesday 5 May 2015 20:45 CEST schreef Dave Angel: > On 05/05/2015 12:18 PM, Cecil Westerhof wrote: > >> >> Well, I did not write many tail recursive functions. But what >> surprised me was that for large values the ‘tail recursive’ version >> was more efficient as the iterative version. And that was with >> myself implementing the tail recursion. I expect the code to be >> more efficient when the compiler implements the tail recursion. >> > > > You've said that repeatedly, so I finally took a look at your > webpage > > https://github.com/CecilWesterhof/PythonLibrary/blob/master/mathDecebal.py > > I didn't have your framework to call the code, so I just extracted > some functions and did some testing.
I definitely need to take care of documentation. It can be called with: python3 mathDecebal.py --factorial The problem is that it will do correctness and speed test. I have to split those in two different things. And use a different file for both. Maybe make a directory test and put a correctness_<function>.py and a speed_<function>.py. > I do see some differences, > where the so-called tail_recursive functions are sometimes faster, > but I did some investigating to try to determine why. > > > I came up with the conclusion that sometimes the multiply operation > takes longer than other times. And in particular, i can see more > variation between the two following loops than between your two > functions. > > > def factorial_iterative(x, simple=False): > assert x >= 0 > result = 1 > j=2 > if not simple: > for i in range(2, x + 1): > result *= i > j += 1 > else: > for i in range(2, x + 1): > result *= j > j += 1 > pass > > return result > > When the "simple" is True, the function takes noticeably and > consistently longer. For example, it might take 116 instead of 109 > seconds. For the same counts, your code took 111. > > I've looked at dis.dis(factorial_iterative), and can see no explicit > reason for the difference. I would say that a variable that is filled by a range is different as a normal variable. Do not ask me why. ;-) Even if you (general not personal you) think that the tail recursion is a waist of time, this is an interesting result I think. -- Cecil Westerhof Senior Software Engineer LinkedIn: http://www.linkedin.com/in/cecilwesterhof -- https://mail.python.org/mailman/listinfo/python-list