[SciPy-dev] Thoughts on weave improvements
Prabhu Ramachandran
prabhu at aero.iitm.ernet.in
Mon Feb 11 22:37:55 EST 2002
hi,
>>>>> "PP" == Pearu Peterson <pearu at cens.ioc.ee> writes:
PP> 3) About callbacks. Indeed, when using 'some hairy, expensive
PP> python code' from C/C++/Fortran, most of the time is spent in
PP> Python (as Prabhu tests show, pure Python is approx 1000 times
PP> slower than any compiled language mentioned above). However,
PP> this 'some hairy, expensive python code' need not to be pure
PP> Python code, it may contain calls to extension modules that
PP> will speed up these callback functions. So, I don't think that
PP> calling callbacks from C/C++/Fortran would be remarkably
PP> expensive unless these callbacks will be really simple (true,
PP> sometimes they just are).
I think I understand what you are getting at. However the following
points are to be noted. My laplace example is truly a toy example and
its intention was to create a simple benchmark and get the new weave
user started quickly.
(0) It was a useful benchmark with realistic esitmates for a simple
problem.
(1) I did not do anything fancy.
(2) There was just one inner loop that was expensive. And here too,
it was the for loop in Python that was 1000 times slower. Function
call overhead in Python was not anywhere near as bad. So if at all
some conclusion about speed is to be determined it is this -- for
loops in Python are horribly slow. Function call overhead while
larger than in C/C++ is not too bad.
(3) A more sophisticated problem would involve far more complexity
than my silly example. Here are a few things that would certainly
be important.
(a) Wrapping simple classes. This means speeding up access to
members. Its obvious that one can use an OOD to deal with true
complexity. If one does not do this and simply restricts oneself
to deal with optimized functions then one might as well develop in
pure C/Fortran. The advantage of a high level language is to be
able to do more than what you can do with C/Fortran easily.
(b) A common way of dealing with complex problems is to construct
an array of similar objects and then invoking some method on each
of these. Take for instance an unstructured grid problem. You'd
construct elements and ask each element to take a time step. Its
a very natural way to program and its important to speed these
things up. If we dont then you have to keep redesigning code just
to get performance which is a pain. I admit that this is a long
term goal but its important to keep in mind.
(c) Its fine if fancy features of Python are not supported but the
basics must be. What those basic features are should be explored
in greater detail.
I need more time to think up a more comprehensive and sensible list
of things.
PP> On Fri, 8 Feb 2002, Pat Miller wrote:
PP> <snip>
>> It might be better if the integration routine, using its
>> knowledge that the argument to x must be a PyFloat (C++ double)
>> could use a C++ accelerated function instead of slow callbacks
>> to Python. Not important for a quick numeric integration, but
>> crucial for using Python as a true C/FORTRAN replacement.
PP> The last statement I find hard to believe. It is almost too
PP> trivial to write down few reasons (don't let your customers to
PP> know about these ;-): 1) Python (or any other scripting
PP> language) cannot never compete with C/FORTRAN in
PP> performance. (I truly hope that you can prove me to be wrong
PP> here.) 2) There are too many high-performance and well-tested
PP> C/FORTRAN codes available (atlas,lapack,fftw to name just few)
PP> and to repeat their implementation in Python is unthinkable,
PP> in addition to the point 1).
I beg to differ here. altas, lapack, fftw etc. only solve some very
fundamental and focussed problems. If you want complex here is an
example -- solve the flow inside a supersonic jet engine. Its
horribly hard and afaik there aren't full fledged solvers that handle
this sort of complexity (completely). People do use CFD for this case
but also use a lot of empirical knowledge. I am not aware of a purely
CFD package that can handle the complete jet engine in software with
no empirical input. I'm sure Pat/Eric will know (or atleast heard) of
much harder problems.
Solving such problems without loosing your hair is a challenge and its
pretty clear to me that using an OO design is the way to go. You cant
achieve that with a hybrid c/fortran/Python option because you'll have
to implement most of the objects in C in which case you do not get the
advantage of developing in Python at all -- so why not just forget
Python and write the whole darned thing in C? Honestly this is what
most folks do. The reason moving this to Python is an important goal
is that it is definitely much easier and nicer coding in Python. The
development cycle is much faster and easier. Its easier to
map/explore the problem out in Python than in C/C++. Rather than
struggle with the problem *and* struggle with C/C++/Fortran, one just
has to struggle with the problem if one is using Python. But this
costs you some speed. The question is how much and how much more
complex a problem can you solve by moving to Python.
Speed of code is not everything. Its known that structured grid
solvers are significantly faster than unstructured grid problems. But
if you have a complex geometry it might take 6 months for someone to
just generate a structured grid for the geometry and then solve it.
OTOH, you can generate a full unstructured grid in a few days (I think
that is conservative). So its not true that complexity (and the
consequent slowdown) is a bad thing.
PP> Simple, transparent, and straightforward mixing of PP>
Python/C/C++/Fortran languages seems to be the way to go in PP>
scientific computing within Python.
There are issues with this also. Its easy to wrap something that can
be encapsulated to a few functions. Anything more complex than that
and you have to wonder if Python is a good choice at all. So PyCOD
and weave are great steps in this direction. Also, as Eric pointed
out most folks aren't comfortable creating wrapper functions all the
times. At the very least PyCOD and weave simplify this.
regards,
prabhu
More information about the SciPy-Dev
mailing list