How to make Python run as fast (or faster) than Julia
bartc
bc at freeuk.com
Mon Feb 26 09:04:53 EST 2018
On 26/02/2018 13:42, Ned Batchelder wrote:
> On 2/26/18 7:13 AM, bartc wrote:
>> A C version is given below. (One I may have messed around with, which
>> I'm not sure works properly. For an original, google for Marsaglia and
>> KISS64 or SUPRKISS64.)
>>
>> Most integers are unsigned, which have well-defined overflow in C
> With proper 64-bit masking (def only64(x): return x &
> 0xFFFFFFFFFFFFFFFF), the Python version produces the correct answer
> using a reasonable amount of memory.
I did try sometime like that, but I must have missed something because I
didn't get quite the same results as a working version.
And with interpreted code, you tend not to test using loops of a billion
iterations.
Well, once you notice that the
> Python code had N=1e5, and the C code had N=1e9 :) If you want to
> experiment, with N=1e5, the final number should be 5255210926702073855.
OK, I'll try that.
> Also, I note that you said, "Most integers are unsigned", but the C code
> has them all declared as signed? It doesn't seem to have mattered to
> your result, but I'm not an expert on C portability guarantees.
The C code I first pasted used 'unsigned', but the main program logic
wasn't right, and I found another version that looked better. That one
used 'signed' for some reason, which I completely missed.
Even if with C it works with either, the signed version might have
'undefined behaviour'. As said, google for the original; the ones I can
see have 'unsigned'. But I can also see a Fortran version that just uses
'integer*8', which I believe is signed 64-bit.
--
bartc
More information about the Python-list
mailing list