Containers of abstract types are not performant,
This is documented in the performance notes section of the manual.
However containers of concrete types are not generic.
For example, I am currently redoing a large section of code from using
Float64s to using Numbers, so that I can use DualNumbers to check
derivatives.
The reason Number (and other abstract types) are slow, is because are full
of pointers.
Since each element of a Matix{Number} could potentially be of a different
type, eg some could be Int8s and some could be Float64s.
But in practice the varse majority of the time, every element is of the
same type.
The 3 signitures:
Matix{Number}
Matrix{Union(Number, Float64, Float32, Float16, Int...) }
Matrix{T<:Number}
All can contain the same information, as they will all contain a
Matrix{Number}, and none of them will contain a Matrix{NotNumber},
(Though to fit a concrete typed matrix into a matrix of abstract type you
need to run a convert),
But they have very different performance.
As I can show with the following Notebook:
http://nbviewer.ipython.org/gist/oxinabox/a00d3b1eb5584467e6b7
Which also compares with Any just for the sake of seeing if contrete types
help (they don't)
What can be seen t Matrix{Union(Number, Float64) }, Matrix{T<:Number} and
Any perform about the same
and that Matrix{Number} is 3 orders of magnitude slower (not unexpected).
Ergo, because the former can contain anything that can be contained in the
Matrix{Number}, there is AFAICT, no reason not to use them.
Worse case senario, the contents really is a Matrix of mixed numeric types
and the performance falls back to the Matrix{Number} case.
Syntactically perhaps it is less nice.
I have a type alias for Matrix{Union(Number, Float64,...)} which solves
that, to an extent.
Argument could be made that Matrix{T<:Number} is even better, but it is
annoying to refactor code to use that as it is not a simple find and
replace as a type parameter needs to be added to all functions.
----
Thoughts, comments,
Reasons why Matrix{Number} might be users over either of the other cases?