Re: Basic Pyrex question
"Matt Hammond" <[email protected]> Fri, 16 May 2008 17:58:21 +0100
| Newsgroups | gmane.comp.python.pyrex |
|---|---|
| Organization | BBC Research & Development |
| Message-ID | <[email protected]> |
To the best of my knowledge, on most common 32bit processor architectures/environments/compilers these days, a long and int are both the same size - 32bits (both wrap at just over +2000000000) I believe python's built in integer support these days automatically transparently starts using a data type capable of handling larger values when the value reaches the threshold of needing it - hence the first of your two examples still works. Matt On Fri, 16 May 2008 17:25:30 +0100, Rick Muller <[email protected]> wrote: > Ah, makes sense. If I do: > > def sumpairs(l): > cdef int i, j > s = 0 > for i in xrange(len(l)): > for j in xrange(i): > s += l[i]*l[j] > return s > > it gives the correct result. Oddly enough, > > def sumpairs(l): > cdef int i, j > cdef long s > s = 0 > for i in xrange(len(l)): > for j in xrange(i): > s += l[i]*l[j] > return s > > doesn't work. > > On Fri, May 16, 2008 at 10:21 AM, Matt Hammond > <[email protected]> > wrote: > >> pyrex compiles down to C and the integer data type in C is probably >> 32bit >> on your platform. That means it can hold a values over the range +/- >> 2000000000 roughly. The result of the calculation you issue is >> substantially >> larger than that, so the maths fails as the value probably simply wraps >> back >> round when it reaches the limit. >> >> regards >> >> >> Matt >> >> >> On Fri, 16 May 2008 17:12:43 +0100, Rick Muller <[email protected]> >> wrote: >> >> I'm just learning Pyrex, and am making a mistake somewhere. I wanted to >>> play >>> with the simple function: >>> >>> def fastsumpairs(l): >>> s = 0 >>> for i in xrange(len(l)): >>> for j in xrange(i): >>> s += l[i]*l[j] >>> return s >>> >>> The first time through, the python and pyrex versions of this routine >>> gave >>> the same result, and the pyrex version was about 30% faster. Sweet. >>> >>> timeit(sumpairs(range(1,1000)): 0.202557 seconds >>> 124583708250 >>> timeit(fastsumpairs(range(1,1000)): 0.155977 seconds >>> 124583708250 >>> >>> Now I tried to modify the code to tell it that s,i,j were ints: >>> >>> def fastsumpairs(l): >>> cdef int s, i, j >>> s = 0 >>> for i in xrange(len(l)): >>> for j in xrange(i): >>> s += l[i]*l[j] >>> return s >>> >>> >>> timeit(sumpairs(range(1,1000)): 0.202557 seconds >>> 124583708250 >>> timeit(fastsumpairs(range(1,1000)): 0.069682 seconds >>> 29656666 >>> >>> So the function is now much faster, but it gives the wrong results. Any >>> hints as to why? >>> >>> >> >> >> -- >> | Matt Hammond >> | Research Engineer, FM&T, BBC, Kingswood Warren, Tadworth, Surrey, UK >> | http://www.bbc.co.uk/rd/ >> > > > -- | Matt Hammond | Research Engineer, FM&T, BBC, Kingswood Warren, Tadworth, Surrey, UK | http://www.bbc.co.uk/rd/