Normalizing A Vector

Alain Ketterlin alain at dpt-info.u-strasbg.fr
Mon Aug 2 06:19:36 EDT 2010


"Bartc" <bartc at freeuk.com> writes:

>> def norm(V):
>>    L = math.sqrt( sum( [x**2 for x in V] ) )
>>    return [ x/L for x in V ]
>
> There's a cost involved in using those fancy constructions.

Sure. The above has three loops that take some time.

> I found the following to be about twice as fast, when vectors are
> known to have 3 elements:
>
> def norm3d(v):
>     L = math.sqrt((v[0]*v[0]+v[1]*v[1]+v[2]*v[2]))
>     return (v[0]/L,v[1]/L,v[2]/L)
>
> (Strangely, changing those divides to multiplies made it slower.)

You mean by setting L to 1.0 / math.sqrt(...) and using v[0]*L etc.?
I think * and / have the same cost on floats, and the added / adds
some cost. But what you observe is probably caused by the overloading of
"*", that needs more type checks. You may try with operator.mul to see
if the call compensates the cost of type checking, but I doubt it.

-- Alain.



More information about the Python-list mailing list