Istvan,

In addition to Thomas's recommendation, you might also have a look at
http://wiki.python.org/moin/PythonSpeed/PerformanceTips
... and more specifically:
http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Loops

It is well-known among experienced Python programmers that for loops
are very expensive -- I would almost guarantee that there are no
mature Python applications that would naively execute a for loop
over 10,000 elements.  If it's not possible to replace the for loop
with a map or a list comprehension, Thomas's suggestion is then
applicable.

Cheers,
Steve

On 10/09/2011 04:01 AM, Thomas Paviot wrote:
Hi Istvan,

It's not a surprise that the python code is slower than the equivalent
C++ code. Have a look at the file
src/wrapper/SWIG_files/linux_darwin/gp_wrap.cpp (the C++ file generated
with swig): you can see that creating a gp_Pnt from coordinates requires
that the _wrap_new_gp_Pnt function is called, then
_wrap_gp_Pnt_SetCoord__SWIG_1. That means that calling gp_Pnt(0,0,0)
from python runs about 50 lines of C++ code. The wrapper code size/speed
is independant from the C++ function wrapped: you won't see any
difference if you call OCE/OCC methods that require high computation
(boolean ops, STEP import/export etc.). It's not the case when calling
"atomic" methods (creating a gp_Pnt from coords for instance).

In my opinion, if you look for performance in your python code, the best
way to proceed is to:
- identify loops that may create a bottleneck
- implement these loops in C++ functions
- wrap these functions with SWIG
- call the functions from python

This will solve performance (as well as memory) issues.

You can easily extend pythonocc with your own SWIG modules. You can for
instance copy/paste the src/wrapper/Visualization folder to
src/wrapper/MyFunctions. Modify the C++ and .i files, and add this new
python module to the setup.py script so that it is compiled with the
usual python setup.py build install.

Thomas

2011/10/8 István Csanády <istvancsan...@gmail.com
<mailto:istvancsan...@gmail.com>>

    Hi,

    I made some tests with pythonOCC and with the pure C++ OCE. According
    to my measurements the 'same' code in python is about 10 times slower
    than the C++ code. For example the following python code:

    for i in xrange(10000):
            p = gp_Pnt(0,0,0)
            face =
    BRepBuilderAPI_MakeFace(gp_Sphere(gp_Ax3(p,gp_Dir(1.,0.,0.)),50.)).Face()

    compared to the C++ code:

    for (int i = 0; i<10000; ++i) {
            gp_Pnt p(0,0,0);
            gp_Sphere sphere(gp_Ax3(p,gp_Dir(1.,0.,0.)),50.);
            TopoDS_Face face = BRepBuilderAPI_MakeFace(sphere).Face();
        }

    The python version is about 8 times slower if I turn off the gc and
    about 10 times if I turn it on.

    Does anybody have any perfomance tips to make the pythonOCC code faster?

    István

    _______________________________________________
    Pythonocc-users mailing list
    Pythonocc-users@gna.org <mailto:Pythonocc-users@gna.org>
    https://mail.gna.org/listinfo/pythonocc-users




_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users


_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to