Mathematica 7 compares to other languages
jon at ffconsultancy.com
Wed Dec 3 17:24:36 CET 2008
Xah Lee wrote:
> On Dec 2, 5:13 pm, Jon Harrop <j... at ffconsultancy.com> wrote:
>> The Mathematica code is 700,000x slower so a 50% improvement will be
>> uninteresting. Can you make my Mathematica code five orders of magnitude
>> faster or not?
> Pay me $10 thru paypal, i'll can increase the speed so that timing is
> 0.5 of before.
> Pay me $100 thru paypal, i'll try to make it timing 0.1 of before. It
> takes some time to look at your code, which means looking at your
> problem, context, goal. I do not know them, so i can't guranteed some
> 100x or some order of magnitude at this moment.
> Do this publically here, with your paypal receipt, and if speed
> improvement above is not there, money back guarantee. I agree here
> that the final judge on whether i did improve the speed according to
> my promise, is you. Your risk would not be whether we disagree, but if
> i eat your money. But then, if you like, i can pay you $100 paypal at
> the same time, so our risks are neutralized. However, that means i'm
> risking my time spend on working at your code. So, i suggest $10 to me
> would be good. Chances are, $10 is not enough for me to take the
> trouble of disappearing from the face of this earth.
My example demonstrates several of Mathematica's fundamental limitations.
They cannot be avoided without improving or replacing Mathematica itself.
These issues are never likely to be addressed in Mathematica because its
users value features and not general performance.
Consequently, there is great value in combining Mathematica with performant
high-level languages like OCaml and F#. This is what the vast majority of
Mathematica users do: they use it as a glorified graph plotter.
>> > few tips:
>> > • Always use Module unless you really have a reason to use Block.
>> Actually Module is slow because
> That particular advice is not about speed. It is about lexical scoping
> vs dynamic scoping.
>> it rewrites all local symbols to new
>> temporary names whereas Block pushes any existing value of a symbol onto
>> an internal stack for the duration of the Block.
> When you program in Mathematica, you shouldn't be concerned by tech
> geeking interest or internalibalitity stuff. Optimization is
> important, but not with choice of Block vs Module. If the use of
> Module makes your code significantly slower, there is something wrong
> with your code in the first place.
What exactly do you believe is wrong with my code?
>> In this case, Module is 30% slower.
> Indeed, because somethnig is very wrong with your code.
No, that is a well-known characteristic of Mathematica's Module and it has
nothing to do with my code.
>> > • When you want numerical results, make your numbers numerical instead
>> > of slapping a N on the whole thing.
> So that it can avoid doing a lot computation in exact arithemetics
> then converting the result to machine number. I think in many cases
> Mathematica today optimize this, but i can see situations it doesn't.
That is a premature optimization that has no significant effect in this case
because all applications of N have already been hoisted.
>> > • Avoid Table when you really want go for speed. Try Map and Range.
>> The time spent in Table is insignificant.
> just like Block vs Module. It depends on how you code it. If Table is
> used in some internal loop, you pay for it.
It is insignificant in this case.
>> > • I see nowhere using Compile. Huh?
>> Mathematica's Compile function has some limitations that make it
>> difficult to leverage in this case:
> When you are doing intensive numerical computation, your core loop
> should be compiled.
No, such computations must be off-loaded to a more performant high-level
language implementation like OCaml or F#. With up to five orders of
magnitude performance difference, that means almost all computations.
>> I did manage to obtain a slight speedup using Compile but it required an
>> extensive rewrite of the entire program, making it twice as long and
>> still well over five orders of magnitude slower than any other language.
> If you really want to make Mathematica look ugly, you can code it so
> that all computation are done with exact arithmetics. You can show the
> world how Mathematica is one googleplex times slower.
I am not trying to make Mathematica look bad. It is simply not suitable when
hierarchical solutions are preferable, e.g. FMM, BSPs, adaptive subdivision
for cosmology, hydrodynamics, geophysics, finite element materials...
The Mathematica language is perhaps the best example of what a Lisp-like
language can be good for in the real world but you cannot compare it to
modern FPLs like OCaml, Haskell, F# and Scala because it doesn't even have
a type system, let alone a state-of-the-art static type system.
Mathematica is suitable for graph plotting and for solving problems where it
provides a prepackaged solution that is a perfect fit. Even then, you can
have unexpected problems. Compute the FFT of 2^20 random machine-precision
floats and it works fine. Raise them to the power of 100 and it becomes
100x slower, at which point you might as well be writing your numerical
code in PHP.
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
More information about the Python-list