4 ms·
Just for the record, let's count to 100 million. And add the numbers up while we're at it. ~ $ time (echo '(do (= n 0) (for i 1 100000000 (++ n i)) prn.n (q
by waterhouse 13y ago
Just for the record, let's count to 100 million. And add the numbers up while we're at it.
~ $ time (echo '(do (= n 0) (for i 1 100000000 (++ n i)) prn.n (quit))' | arc)
Welcome to Racket v5.3.5.1.
Use (quit) to quit, (tl) to return here after an interrupt.
arc> 5000000050000000
real 0m28.561s
user 0m28.308s
sys 0m0.249s
----
~ $ time (echo -e 'n=0 \ni=0 \nwhile (i <= 100000000): \n n += i \n i += 1 \n\nprint(n)\n' | python3.3)
5000000050000000
real 0m30.244s
user 0m30.230s
sys 0m0.013s
It would appear to be competitive with Python on my machine on this particular task. (Also you can make it faster by dropping into Racket.)
- dzderic 13y agoA while loop and temporary mutable variables are definitely not the Pythonic way of doing this. More idiomatic: $ time python -c 'print sum(xrange(100000000 + 1))' 5000000050000000 real 0m1.398s user 0m1.383s sys 0m0.012s Comparison to baseline: $ time (echo -e 'n=0 \ni=0 \nwhile (i <= 100000000): \n n += i \n i += 1 \n\nprint(n)\n' | python) 5000000050000000 real 0m33.140s user 0m32.939s sys 0m0.023s
- waterhouse 13y agoI see. That is good to know; I merely chose mutating global variables in a loop because I knew how to do that in both languages. (I am not very familiar with Python.) That is not the idiomatic way to do it in Arc, either. I would normally use a recursive function, like this: arc> (time:xloop (i 0 n 0) (if (> i 100000000) n (next (+ i 1) (+ n i)))) time: 9121 cpu: 9130 gc: 0 mem: 480 ; the times are in msec 5000000050000000 Or perhaps a "higher-order function": arc> (time:sum idfn 1 100000000) time: 19889 cpu: 19908 gc: 0 mem: 1224 5000000050000000 Or use a deforestation macro that I wrote, which is closest to your Python example: arc> (time:thunkify:reduce + (range 1 100000000)) time: 17971 cpu: 17985 gc: 0 mem: 3592 5000000050000000 Also, here's what you can get by dropping into Racket: arc> (time:$:let loop ((i 0) (n 0)) (if (> i 100000000) n (loop (+ i 1) (+ n i)))) time: 402 cpu: 403 gc: 0 mem: 920 5000000050000000 I suppose Python has an analogue of that--dropping into C, or at least loading C libraries. Which Racket can do too. Mmm.