Python speed vs csharp
Siegfried Gonzi
siegfried.gonzi at kfunigraz.ac.at
Mon Aug 4 00:40:11 CEST 2003
Mike wrote:
> Ugh. Because I can't be trusted with a calculator, that's why. 1.5 billion
> should be 150 million. The elapsed times are correct: 210 seconds and 3500
> seconds.
I cannot see your original message except on google:
Hi:
I am sure you know what you are after, but Python for numerical
computations is more or less crap. Not only has Python a crippled
syntax it is most of the time dog slow and unpredictable. Python is
more or less a fraud. But I must admit it is sometimes immensly useful
due to its big pool of add-on libraries. But I would rather like to
see that all the manpower gets concentrated in languages which
deserve to be called a programming language (for example Scheme,
CommonLisp, Ada, C++,..).
I am not sure what exactly are your simulation problems and
requirements but the Bigloo (Scheme) compiler is very robust and I use
it every day for numerical computations. I once used Python but
quickly stopped using it and I have never looked back.
For example Bigloo lets you specify types. It is easy to specify types
in Bigloo and the code is transportable even, provided you write a
small macro where the compiler decides wheter it is Bigloo or
not. Normally, giving types in Bigloo puts you in the range of "only 2
times slower than C"; also for heavy numerical computations. The
following small Scheme program sums up your error function 10^6
times. Also included a C program. The timings on a simple Celeron
laptop are as follows:
g++ -O3 erf.c : 0.5 seconds
bigloo -Obench erf.scm: 1.1 seconds
The Bigloo code could be a bit improved because I do not know wheter
using (expn x 2.0) introduces a bottleneck in Bigloo. If there are only
floating
point calculations involved Bigloo is as fast as C (see
comp.lang.scheme and my code for the Coyote Gulch benchmark; see also
slashdot). If you have big arrays Bigloo's gap to C is shifted towards
a factor of 2 or in hard cases 3. This is still fairly good.
Not to cheerlead Bigloo or Scheme here. If you are pragmatic stay with
Python it has really tons of add-on libraries and huge community.
S. Gonzi
;;;;;;;;;;;;;;;;; BIGLOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(module erfc2
(option (set! *genericity* #f)))
(define (erfc x )
(let* ((x (exact->inexact x))
(p 0.3275911)
(a1 0.254829592)
(a2 -0.284496736)
(a3 1.421413741)
(a4 -1.453152027)
(a5 1.061405429)
(t (/fl 1.0
(+fl 1.0
(*fl p
x))))
(erfcx (*fl
(*fl t
(+fl a1
(*fl t (+fl a2
(*fl t
(+fl a3
(*fl t
(+fl a4
(*fl t a5)))))))))
(exp (- (expt x 2.0))))))
erfcx))
(define (do-it)
(let ((erg 0.0))
(do ((i 0 (+fx i 1)))
((=fx i 1000000))
(set! erg (+fl erg (erfc 0.456))))
erg))
(print (do-it))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; C ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <stdio.h>
#include <math.h>
double erfc( double x )
{
double p, a1, a2, a3, a4, a5;
double t, erfcx;
p = 0.3275911;
a1 = 0.254829592;
a2 = -0.284496736;
a3 = 1.421413741;
a4 = -1.453152027;
a5 = 1.061405429;
t = 1.0 / (1.0 + p*x);
erfcx = ( (a1 + (a2 + (a3 +
(a4 + a5*t)*t)*t)*t)*t ) * exp(-pow(x,2.0));
return erfcx;
}
int main()
{
double erg=0.0;
int i;
for(i=0; i<1000000; i++)
{
erg += erfc(0.456);
}
printf("%f",erg);
return 1;
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
More information about the Python-list
mailing list