[Numpy-discussion] Anyone have a well-tested SWIG-based C++ STL valarray <=> numpy.array typemap to share?
David Cournapeau
david at ar.media.kyoto-u.ac.jp
Tue Sep 18 00:35:08 EDT 2007
Christopher Barker wrote:
> David Cournapeau wrote:
>> Christopher Barker wrote:
>>> My real question is what compiler and library writers are doing -- has
>>> anyone (OK, I guess MS and gcc are all I care about anyway) built
>>> anything optimized for them? Are they going to dump them? Who knows?
>> What do you mean by optimization ?
>
> Well, I'm quite specifically not being precise about that. It appears
> the POINT of valarray was to provide a way to do computation that
> compiler(library) writers could optimize in various ways for the system
> at hand. The one example I have seen is someone that wrote a version
> that takes advantage of the PPC altivec instructions:
>
> (http://www.pixelglow.com/stories/altivec-valarray-2/)
>
> Anyway, at this point I'm far less concerned about optimization that
> just a more robust and convenient way to deal with data that raw pointers.
>
>> I
>> remember having used blitz at some point, and I thought it was terrible.
>
> Darn -- it looks so promising.
I realize that I sounded more convinced than I really am. First, to make
my perspective more obvious, let me say that I generally hate template.
I think the syntax is terrible, and make the code totally unreadable for
everything but simple cases (simple container, for example); I think it
is a wrong solution for a broken language. So I prefer to avoid them if
I can.
My understanding of blitz is that it is supposed to be faster mainly
because it can avoid temporaries thanks to expression template. So if
you don't need this feature, you don't gain much. But when you think
about it, avoiding temporaries is done by symbolic computation at the
compiler level through template; the idea is to make expressions such as
A = B * C + D * E^-1 * F where everything is a matrix the most efficient
possible. C/C++ makes it hard because it needs to use binary operations
with a returned value. So in the end, this is really a parsing problem;
if so, why not use a language which can do symbolic computation, and
convert them into a compiled language ? By using expression template,
you use a totally broken syntax to do things which are much more easily
done by a language easy to parse (say LISP).
When you take a look at
http://ubiety.uwaterloo.ca/~tveldhui/papers/DrDobbs2/drdobbs2.html, you
also realize that the tests are done on architectures/compilers which
are different from the ones available now.
The only way to really know is to do your own tests: have a reasonable
example of the kind of operations you intend to do, benchmark it, and
see the differences. My experience says it definitely does not worth it
for my problems. Maybe yours will be different.
>
>> I think C++ is much more useful
>> for the automatic memory management through RAII, which is what
>> std::vector gives you.
>
> and std::valarray not? I guess where I'm at now is deciding if there is
> any advantage or disadvantage to using std::valarray vs. std::vector.
> The other option is to go with something else: boost::multiarray,
> blitz++, etc. However, at least in term of how well they might p;lay
> with numpy arrays, I don't see a reason to do so.
Valarray and vector give you more or less the same here concerning RAII.
But vector really is more common, so I would rather pick up vector
instead of valarray unless there is a good reason not to do so, not the
contrary. I don't know much boost::multiarray (I tried a bit ublas, and
found the performances quite bad compared to C, using gcc; again, this
was a few years ago, it may have changed since). I almost never used
more than rank 2 arrays, so I don't know much about multi_array.
cheers,
David
More information about the NumPy-Discussion
mailing list