Some static constructors could be useful.
up, down, left, right
forward, back
zero, one, two, ...
>>> velocity = Vector3(1, 2, 3)
We want to go two left? This is sort of nice.
>>> velocity + Vector3.left * 2
<Vector3(-1, 2, 3)>
>>> Vector3.left
<Vector3(-1, 0, 0)>
>>> Vector3.right
<Vector3(1, 0, 0)>
>>> Vector3.up
<Vector3(0, 1, 0)>
They are unit vectors (length 1) in a particular direction.
Plus a few other useful constants.
>>> Vector3.one
<Vector3(1, 1, 1)>
etc.
If I remove PyArg_ParseTuple entirely...
%timeit Vector3()
10000000 loops, best of 3: 104 ns per loop
(I guess it'd be around 84ns as a static attribute lookup which constructs a new vector).
So these special constructors, as well as being readable would be faster.
It'd still be quicker to declare them as variables, and make them immutable.
vec3_left = Vector3(-1, 0, 0)
%timeit vec3_left
10000000 loops, best of 3: 24 ns per loop
Note below, how the 'vec3_left' variable is lots quicker.
%timeit velocity + Vector3(-1, 0, 0) * 2
1000000 loops, best of 3: 451 ns per loop
%timeit velocity + vec3_left * 2
10000000 loops, best of 3: 184 ns per loop
We make a pretend Vector3 with a left variable to see how quick it is.
In [27]: class Vector3:
...: pass
...:
In [28]: Vector3.left = vec3_left
%timeit Vector3.vector_left
10000000 loops, best of 3: 44.1 ns per loop
In [29]: %timeit velocity + Vector3.left * 2
1000000 loops, best of 3: 214 ns per loop
So it seems making some immutable vectors would be useful for a 10.2x - 18.8x speedup.
Without immutable vectors, 5.3x speedup.
Plus, I think they'd be more readable, and perhaps instructive.