474,068 Members | 1,998 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Python is darn fast (was: How fast is Python)

I posted this few weeks ago (remember the C Sharp thread?) but it went
unnoticed on the large mass of posts, so let me retry. Here I get Python+
Psyco twice as fast as optimized C, so I would like to now if something
is wrong on my old laptop and if anybody can reproduce my results.
Here are I my numbers for calling the error function a million times
(Python 2.3, Psyco 1.0, Red Hat Linux 7.3, Pentium II 366 MHz):

$ time p23 erf.py
real 0m0.614s
user 0m0.551s
sys 0m0.029s

This is twice as fast as optimized C:

$ gcc erf.c -lm -o3
$ time ./a.out
real 0m1.125s
user 0m1.086s
sys 0m0.006s

Here is the situation for pure Python

$time p23 erf.jy
real 0m25.761s
user 0m25.012s
sys 0m0.049s

and, just for fun, here is Jython performance:

$ time jython erf.jy
real 0m42.979s
user 0m41.430s
sys 0m0.361s

The source code follows (copied from Alex Martelli's post):

----------------------------------------------------------------------

$ cat erf.py
import math
import psyco
psyco.full()

def erfc(x):
exp = math.exp

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(-x*x)
return erfcx

def main():
erg = 0.0

for i in xrange(1000000) :
erg += erfc(0.456)

if __name__ == '__main__':
main()

--------------------------------------------------------------------------

# python/jython version = same without "import psyco; psyco.full()"

--------------------------------------------------------------------------

$cat erf.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(-x*x);

return erfcx;
}

int main()
{
double erg=0.0;
int i;

for(i=0; i<1000000; i++)
{
erg = erg + erfc(0.456);
}

return 0;
}

Michele Simionato, Ph. D.
Mi************* *@libero.it
http://www.phyast.pitt.edu/~micheles
--- Currently looking for a job ---
Jul 18 '05
18 4914
On Sun, 24 Aug 2003 00:31:15 +0100, John J. Lee wrote:
Irmen de Jong <irmen@-NOSPAM-REMOVETHIS-xs4all.nl> writes:
P@draigBrady.co m wrote:
.... but Python+Psyco still wins :-)


So, the interesting part is: why?
John


My suspicion is that when psyco looks at erfc, it
finds that nothing changes and so replaces the
function call with the resulting number (am i right? it's the
same each time?). This is what a "specializi ng compiler"
would do, me thinks. So, try using a different number
with each call.

Simon.

Jul 18 '05 #11
Lawrence Oluyede wrote:
P@draigBrady.co m wrote:
If you want to try different machines
then http://www.pixelbeat.org/scripts/gcccpuopt will give
you the appropriate machine specific gcc options to use.


Very cool script, thanks :) Anyway it didn't change so much with erf.c
erfCPU is compiled with the flags suggested by gcccpuopt script:

$ gcccpuopt
-march=athlon-xp -mfpmath=sse -msse -mmmx -m3dnow


You still need some -O optimization flags. The -m options just let gcc
generate some nice instructions specific to your Athlon CPU.

Also, I don't think that script is all that useful because at least some
(if not all) of those -m options are already implied by -march=athlon-xp
(I don't recall which ones off the top of my head but I'll find a
reference for anyone interested... you can also find out by looking at
the gcc command line option parsing code).

Anyone who wants some other good ideas for the best flags on their
machine check out ccbench:

http://www.rocklinux.net/packages/ccbench.html

The problem here of course is that not all applications behave like the
benchmarks :(

Van Gale

Jul 18 '05 #12
Van Gale wrote:
You still need some -O optimization flags. The -m options just let gcc
generate some nice instructions specific to your Athlon CPU.


I didn't mention but I also used -O3 flag. I don't know why but on my
machine C code is faster than psyco code in this test

--
Lawrence "Rhymes" Oluyede
http://loluyede.blogspot.com
rh****@NOSPAMmy self.com
Jul 18 '05 #13
Van Gale <ne**@exultants .org> wrote in message news:<XK******* **********@news svr27.news.prod igy.com>...
Michele Simionato wrote:
I posted this few weeks ago (remember the C Sharp thread?) but it went
unnoticed on the large mass of posts, so let me retry. Here I get Python+
Psyco twice as fast as optimized C, so I would like to now if something
is wrong on my old laptop and if anybody can reproduce my results.
Here are I my numbers for calling the error function a million times
(Python 2.3, Psyco 1.0, Red Hat Linux 7.3, Pentium II 366 MHz):

$ gcc erf.c -lm -o3


Did you really use "-o3" instead of "-O3"? The lowercase -o3 will
produce object code file named "3" instead of doing optimization.


Yes, I used -O3, this was a misprint in the e-email. The compiler was
gcc 2.96.

Michele Simionato, Ph. D.
Mi************* *@libero.it
http://www.phyast.pitt.edu/~micheles
--- Currently looking for a job ---
Jul 18 '05 #14
I finally came to the conclusion that the exceeding good performance
of Psyco was due to the fact that the function was called a million
times with the *same* argument. Evidently Psyco is smart enough to
notice that. Changing the argument at each call
(erfc(0.456) -> i/1000000.0) slows down Python+Psyco at 1/4 of C speed.
Psyco improves Python performance by an order of magnitude, but still it
is not enough :-(

I was too optimistic!

Here I my numbers for Python 2.3, Psyco 1.0, Red Hat Linux 7.3,
Pentium II 366 MHz:

$ time p23 erf.py
real 0m3.245s
user 0m3.164s
sys 0m0.037s

This is more than four times slower than optimized C:

$ gcc erf.c -lm -O3
$ time ./a.out
real 0m0.742s
user 0m0.725s
sys 0m0.002s

Here is the situation for pure Python

$time p23 erf.jy
real 0m27.470s
user 0m27.162s
sys 0m0.023s

and, just for fun, here is Jython performance:

$ time jython erf.jy
real 0m44.395s
user 0m42.602s
sys 0m0.389s

----------------------------------------------------------------------

$ cat erf.py
import math
import psyco
psyco.full()

def erfc(x):
exp = math.exp

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(-x*x)
return erfcx

def main():
erg = 0.0

for i in xrange(1000000) :
erg += erfc(i/1000000.0)

if __name__ == '__main__':
main()

--------------------------------------------------------------------------

# python/jython version = same without "import psyco; psyco.full()"

--------------------------------------------------------------------------

$cat erf.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(-x*x);

return erfcx;
}

int main()
{
double erg=0.0;
int i;

for(i=0; i<1000000; i++)
{
erg = erg + erfc(i/1000000.0);
}

return 0;
}

Michele Simionato, Ph. D.
Mi************* *@libero.it
http://www.phyast.pitt.edu/~micheles/
---- Currently looking for a job ----
Jul 18 '05 #15
Michele Simionato wrote:
I finally came to the conclusion that the exceeding good performance
of Psyco was due to the fact that the function was called a million
times with the *same* argument. Evidently Psyco is smart enough to
notice that. Changing the argument at each call
(erfc(0.456) -> i/1000000.0) slows down Python+Psyco at 1/4 of C speed.
Psyco improves Python performance by an order of magnitude, but still it
is not enough :-(
This is not suprising. Last I checked, Psyco does not fully compile
floating point expressions. If, I rememeber correctly (though every time
try to delve too deeply into Psyco my brains start oozing out my ears),
there are three ways a in which a given chunk of code evaluated. At one
level, which I'll call #1, Psyco generates the machine code(*) for the
expression. At a second level, Psyco calls out to C helper functions,
but still works with unboxed values. At the third level, Psyco punts and
creates a Python object and hands things off to the interpreter.

Most integer functions operate at level #1, so they tend to be quite
fast. Most floating point operations operate at level #2, so they have a
certain amount of overhead, but are still much faster than unpsyco
(sane?) Python. I believe the reason for this is that x86 floating point
operations are very messy, so Armin punted...

(*) Armin is working on virtual machine implementation of Psyco, so it
should be available on non x86 machines soon.

FWIW,

-tim

I was too optimistic!

Here I my numbers for Python 2.3, Psyco 1.0, Red Hat Linux 7.3,
Pentium II 366 MHz:

$ time p23 erf.py
real 0m3.245s
user 0m3.164s
sys 0m0.037s

This is more than four times slower than optimized C:

$ gcc erf.c -lm -O3
$ time ./a.out
real 0m0.742s
user 0m0.725s
sys 0m0.002s

Here is the situation for pure Python

$time p23 erf.jy
real 0m27.470s
user 0m27.162s
sys 0m0.023s

and, just for fun, here is Jython performance:

$ time jython erf.jy
real 0m44.395s
user 0m42.602s
sys 0m0.389s

----------------------------------------------------------------------

$ cat erf.py
import math
import psyco
psyco.full()

def erfc(x):
exp = math.exp

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(-x*x)
return erfcx

def main():
erg = 0.0

for i in xrange(1000000) :
erg += erfc(i/1000000.0)

if __name__ == '__main__':
main()

--------------------------------------------------------------------------

# python/jython version = same without "import psyco; psyco.full()"

--------------------------------------------------------------------------

$cat erf.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(-x*x);

return erfcx;
}

int main()
{
double erg=0.0;
int i;

for(i=0; i<1000000; i++)
{
erg = erg + erfc(i/1000000.0);
}

return 0;
}

Michele Simionato, Ph. D.
Mi************* *@libero.it
http://www.phyast.pitt.edu/~micheles/
---- Currently looking for a job ----


Jul 18 '05 #16
dan
mi**@pitt.edu (Michele Simionato) wrote in message
news:<22******* *************** ****@posting.go ogle.com>...
I finally came to the conclusion that the exceeding good performance
of Psyco was due to the fact that the function was called a million
times with the *same* argument. Evidently Psyco is smart enough to
notice that. Changing the argument at each call
(erfc(0.456) -> i/1000000.0) slows down Python+Psyco at 1/4 of C speed.
Psyco improves Python performance by an order of magnitude, but still it
is not enough :-(

It's plenty! A factor of 4 from optimized C, considering the newness
and limited resources behind psyco, is very encouraging, and good
enough for most tasks. Java JIT compilers are still around a factor
of 2 slower than C, and they've had at least 2 orders of magnitude
more whumpage.

This is a far cry from the factor of 10-30 I've been seeing with pure
python. For performance-critical code, this could be the difference
between hand-coding 5% versus 20% of your code.

Excellent news!!
Jul 18 '05 #17
da*******@yahoo .com (dan) writes:
mi**@pitt.edu (Michele Simionato) wrote in message
news:<22******* *************** ****@posting.go ogle.com>... [...] This is a far cry from the factor of 10-30 I've been seeing with pure
python. For performance-critical code, this could be the difference
between hand-coding 5% versus 20% of your code.

Excellent news!!


If you care about this a lot, don't forget Pyrex.
John
Jul 18 '05 #18
dan
right, pyrex -- looked at that a while ago. Compiled Python with
C-style type declarations, right? Kinda like common lisp??? (I'm
stretching my memory cells now)

will review

jj*@pobox.com (John J. Lee) wrote in message news:<87******* *****@pobox.com >...
da*******@yahoo .com (dan) writes:
mi**@pitt.edu (Michele Simionato) wrote in message
news:<22******* *************** ****@posting.go ogle.com>...

[...]
This is a far cry from the factor of 10-30 I've been seeing with pure
python. For performance-critical code, this could be the difference
between hand-coding 5% versus 20% of your code.

Excellent news!!


If you care about this a lot, don't forget Pyrex.
John

Jul 18 '05 #19

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
731
by: Michele Simionato | last post by:
I posted this few weeks ago (remember the C Sharp thread?) but it went unnoticed on the large mass of posts, so let me retry. Here I get Python+ Psyco twice as fast as optimized C, so I would like to now if something is wrong on my old laptop and if anybody can reproduce my results. Here are I my numbers for calling the error function a million times (Python 2.3, Psyco 1.0, Red Hat Linux 7.3, Pentium II 366 MHz): $ time p23 erf.py real ...
47
3729
by: Michael Scarlett | last post by:
There is an amazing article by paul graham about python, and an even better discussion about it on slashdot. The reason I point this out, is the more I read both articles, the more I realised how we would be mutilating the language with that god forsaken @ decorator. I don't know about the rest of you, but I learned python and fell in love with its syntax and simplicity. Python - just works. So please GVR. Don't complicate it. Leave it as...
81
4817
by: julio | last post by:
Sorry but there is no another way, c# .net and mono are going to rip python, not because python is a bad lenguage, but because is to darn old and it refuses to innovate things, to fix wrong things, just because retarded backwards compatibility and because the python comunity and developers refuses to consider tools as being almost as important as the language itself. What does c# .net has that python doesnt ? (significant features) --...
44
2587
by: Iwan van der Kleyn | last post by:
Please ignore if you are allergic to ramblings :-) Despite a puritan streak I've always tried to refrain from language wars or syntax bickering; call it enforced pragmatism. That's the main reason why I've liked Python: it's elegant and simple and still dynamic and flexible. You could do worse for a clean and pragmatic language. I do know my Smaltalk from my Common Lisp and my Ruby from my C#, so I think I'm quite capable of escaping...
50
5841
by: diffuser78 | last post by:
I have just started to learn python. Some said that its slow. Can somebody pin point the issue. Thans
13
5944
by: abhinav | last post by:
Hi guys.I have to implement a topical crawler as a part of my project.What language should i implement C or Python?Python though has fast development cycle but my concern is speed also.I want to strke a balance between development speed and crawler speed.Since Python is an interpreted language it is rather slow.The crawler which will be working on huge set of pages should be as fast as possible.One possible implementation would be...
118
6865
by: 63q2o4i02 | last post by:
Hi, I've been thinking about Python vs. Lisp. I've been learning Python the past few months and like it very much. A few years ago I had an AI class where we had to use Lisp, and I absolutely hated it, having learned C++ a few years prior. They didn't teach Lisp at all and instead expected us to learn on our own. I wasn't aware I had to uproot my thought process to "get" it and wound up feeling like a moron. In learning Python I've...
8
2303
by: Nicholas Reville | last post by:
Hi, I hope this is an OK spot for this question: I'm a co-founder of the Participatory Culture Foundation (pculture.org), we're a non-profit that develops Democracy Player and some related internet TV tools (see getdemocracy.com). Democracy Player has a Python backend with native front-ends for Mac, Windows, and Linux. We're looking to expand our development team, but we haven't been getting enough top-quality applicants. I was...
53
5389
by: Vicent Giner | last post by:
Hello. I am new to Python. It seems a very interesting language to me. Its simplicity is very attractive. However, it is usually said that Python is not a compiled but interpreted programming language —I mean, it is not like C, in that sense. I am working on my PhD Thesis, which is about Operations Research,
0
10612
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
10413
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
11190
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
10389
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
7937
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
6735
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
6925
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
5493
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4987
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.