[SciPy-user] python (against java) advocacy for scientific projects

Ravi lists_ravi at lavabit.com
Mon Jan 19 14:58:19 EST 2009


Hi,
  The advice from Mr. Molden is well-argued, but he does gloss over a few of 
the difficulties. These serious problems are also present in Matlab & Java for 
the most part.

1. The python packaging system is junk. Matlab & Java get around this problem 
by not really having a packing system (leading to even worse confusion). PyPi 
& setuptools are painful (search enthought-dev & ipython-dev lists for the 
last year, especially for posts from Fernando Perez & Gael Varoquaux, for more 
information).

2. Installation/compilation of C/C++ extensions/wrappers: Matlab's cohesive 
toolbox shines here; their method is clearly documented and works reasonably 
well across all the platforms they support (at least on Solaris, HPUX, Linux & 
Windows, the plaforms I work with). Java extensions are, IMHO, reasonably 
straightforward to maintain, but python distutils takes everything to a whole 
new level of nightmare. For distutils difficulties, simply search the archives 
for this mailing list (especially those from David Cournepeau).

3. The lack of a real JIT compiler is a serious issue if the use cases involve 
more than linear algebra and differential equation solvers. In many such 
cases, for-loops and/or while-loops are the only reasonable solutions, both of 
which, very often, execute much faster under Matlab or Java. Some operations 
are simply not vectorizable if you wish to have maintainable code, e.g., large 
groups of interacting state machines.

4. Both Java & Matlab have very well-thought out IDEs. As I don't use IDEs 
myself, I cannot comment on their ease of use, but my colleagues who do work 
with them find them extremely useful. Neither eclipse-pydev nor eric3 is 
anywhere close to the Matlab IDE workspace. Java has several very nice IDEs 
but none of them are as useful as the Matlab IDE. A related issue is the lack 
of a decent debugger; pydb+ipython is the best one I have come across for 
python, but they are nowhere near Matlab/Java offerings.

In spite of the issues highlighted above, Python is still the best choice, 
beacuse of the large library and because of the well-designed language 
specification. (Cpython's shortcomings are well-known and will eventually be 
addressed by PyPy and the like; in some computation-intensive cases, even 
IronPython beats out cpython, go figure.)

Mr. Molden has provided a very good summary of the Python workflow but there 
is one issue that keeps rearing its ugly head on the numpy/scipy lists over & 
over again:

On Monday 19 January 2009 11:14:28 Sturla Molden wrote:
> 9. If the bottleneck cannot be solved by libraries or changing
> algorithm, re-write these parts in Fortran 95. Compile with f2py to get
> a Python callable extension module. Real scientists do not use C++ (if
> we need OOP, we have Python.)

I completely agree with the first part of the point above. (Use Fortran95 or 
many of the other languages which have very good numerical performance to 
speed up bottlenecks). However, the last part is merely ugly prejudice. Like 
python, Fortran, and other languages, C++ does have its place in scientific 
computing. Here's one example which, in my experience, is completely 
impossible to do in python, Matlab, Java or even C:
  The bottleneck in one our simulations is a fixed point FFT computation 
followed by a modified gradient search. Try implementing serious fixed-point 
computation with, say, 13-bit numbers, some of which are optimally expressed 
in log-normal form and the others in the standard form, on 
python/Matlab/Java/C. You will end up with either unmaintainable code or 
unusably slow code. C++ templates & a little bit of metaprogramming make 
prototyping the algorithm easy (because you can use doubles to verify data 
flow) while simultaneously making it easy to enhance the prototype quickly 
into fixed point code (simply by replacing types and running some automated 
tests to find appropriate bit-widths). In our case, we needed to optimize the 
radix of the underlying FFTs as well because of some high throughput 
considerations.

Admittedly, the problem considered above is pretty difficult & pretty 
specialized, but the beauty of C++ or even of PL/1 is that it makes certain 
difficult problems tractable: problems which are practically impossible to 
solve with python/Java/Matlab/C. Leave your programming language prejudices at 
home when you consider afresh the optimal solutions to your problem.

Regards,
Ravi





More information about the SciPy-User mailing list