Oh yes. Thanks.

TLDR; those are fixed. Should pygame.Vector2 and Vector2 go in
pygame.locals by default?



a) I fixed it so it returns a Vector2, or Vector3 as is appropriate.
Something like v.xyxy (length==4) returns a tuple.
type(v.xy) == float
type(v.xy) == Vector2
type(v.xyz) == Vector3
type(v.xyzx) == tuple

b) v.x = 3 works again.
c) updated the docs, removed experimental notice.
d) swizzling is now faster than fetching single attributes. (v.xyz is
faster than (v.x, v.y, v.z)).

    In [1]: import pygame.math
    In [2]: v = pygame.math.Vector3(1,2,3)
    In [3]: %timeit v.xyz
    The slowest run took 230.33 times longer than the fastest. This could
mean that an intermediate result is being cached.
    10000000 loops, best of 3: *77.8 ns* per loop
    In [4]: %timeit pygame.math.Vector3(v.x, v.y, v.z)
    The slowest run took 25.69 times longer than the fastest. This could
mean that an intermediate result is being cached.
    1000000 loops, best of 3: *465 ns* per loop

    In [5]: %timeit v.xy
    The slowest run took 25.73 times longer than the fastest. This could
mean that an intermediate result is being cached.
    10000000 loops, best of 3: 73.5 ns per loop
    In [6]: %timeit (v.x, v.y)
    The slowest run took 18.30 times longer than the fastest. This could
mean that an intermediate result is being cached.
    10000000 loops, best of 3: 135 ns per loop
    In [7]: %timeit pygame.math.Vector2(v.x, v.y)
    The slowest run took 31.03 times longer than the fastest. This could
mean that an intermediate result is being cached.
    1000000 loops, best of 3: 353 ns per loop
    In [8]: Vector2 = pygame.math.Vector2
    In [9]: %timeit Vector2(v.x, v.y)
    The slowest run took 13.55 times longer than the fastest. This could
mean that an intermediate result is being cached.
    1000000 loops, best of 3: 310 ns per loop

This was because before it was handling swizzle attribute access by waiting
for an error.

Now, (x,y,z) attribute access is just as fast, and swizzles are a lot
faster.
However other methods are about 10ns slower (on this machine).

    In [10]: pygame.math.disable_swizzling()
    In [11]: %timeit v.is_normalized()
    The slowest run took 28.18 times longer than the fastest. This could
mean that an intermediate result is being cached.
    10000000 loops, best of 3: 83.3 ns per loop
    In [12]: pygame.math.enable_swizzling()
    In [13]: %timeit v.is_normalized()
    The slowest run took 28.89 times longer than the fastest. This could
mean that an intermediate result is being cached.
    10000000 loops, best of 3: 94.1 ns per loop


Another downside of Vectors at the moment is that they allocate more slowly
than tuples.
Because python tuples and lists are optimized over normal objects, and use
a memory pool.
However, it's close to list if you use the list() constructor, and 2x
faster than a python object.

    In [1]: import pygame.math
    In [2]: v=pygame.math.Vector2(1,2)
    In [3]: Vector2 = pygame.math.Vector2
    In [4]: %timeit Vector2(1.0,2.0)
    The slowest run took 11.90 times longer than the fastest. This could
mean that an intermediate result is being cached.
    10000000 loops, best of 3: 197 ns per loop
    In [5]: %timeit (1.0,2.0)
    100000000 loops, best of 3: 14.5 ns per loop
    In [6]: %timeit list((1,2))
    The slowest run took 5.76 times longer than the fastest. This could
mean that an intermediate result is being cached.
    1000000 loops, best of 3: 205 ns per loop
    In [7]: class V(object):
       ...:     def __init__(self, x, y):
       ...:         self.x = x
       ...:         self.y = y
       ...:
    In [8]: %timeit V(1,2)
    The slowest run took 5.96 times longer than the fastest. This could
mean that an intermediate result is being cached.
    1000000 loops, best of 3: 422 ns per loop


https://github.com/pygame/pygame/pull/403





What about?
1) Putting them in pygame.Vector2, pygame.Vector3 and in pygame.locals?
pygame.math imported by default.

Some other topics/issues... (perhaps all for later?)

- types in python are spelt with a lower case these days (post python 1.5.2
*ahem*).
- We should probably call them vec2, vec3 as per GLSL (and as per python
naming of types).
- We are missing other swizzle attribute names from GLSL, like rgba.
- There is some support in the code for Vector4... but a number of the
methods would need to be written first.
- Now that vectors have this nice slicing/swizzling support... what about
colors and rects?
- Should all types be consistently lower case? color, rect? 'rect' is used
a lot in code... to mean an instance Maybe not.
- there's some commented out code for buffer handling. Useful when you want
a vector to act on a bigger list of data.
- allocation of new vectors could be improved perhaps to approach tuple
speed?




On Sun, Feb 25, 2018 at 12:05 PM, Daniel Pope <ma...@mauveweb.co.uk> wrote:

> Indeed, getting the attribute returns a float so the attribute should be
> settable as a float for consistency.
>
> If users are familiar with GLSL[1], they might be surprised that the type
> of vectors returned by swizzle attribute access is not a vector:
>
> >>> from pygame.math import Vector3, enable_swizzling
> >>> enable_swizzling()
> >>> Vector3()
> <Vector3(0, 0, 0)>
> >>> v = Vector3(1, 2, 3)
>
> >>> v.xy
> (1.0, 2.0)
> >>> type(v.xy)
> <class 'tuple'>
>
> [1] https://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_
> Matrix_Operations#Components
>
>
> On Sun, 25 Feb 2018 at 09:38 René Dudfield <ren...@gmail.com> wrote:
>
>> Hi,
>>
>> that's a good point.
>>
>> TLDR; I think it should be on by default too. There's still a couple of
>> issues with doing that.
>>
>>
>> It should have _no_ cost in almost all cases for attribute access.
>> Because it first tries normal attribute access.
>> See: https://github.com/pygame/pygame/blob/master/src/math.c#L1517
>>
>> I guess the reason is it's off by default is because it was implemented
>> later on, and to leave it on in a buggy state caused issues.
>>
>> Not a big concern, but turning it on by default will perhaps have
>> annoying compatibility issues for people using an old pygame.
>> If they forget to turn it on.
>>
>> There's two test failures once I changed to be enabled by default:
>>
>> >>> import pygame.math
>> >>> v = pygame.math.Vector2(1,2)
>> >>> v.x = 3
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: a sequence is expected
>> >>> pygame.math.disable_swizzling()
>> >>> v.x = 3
>> >>> v
>> <Vector2(3, 2)>
>>
>> These are to do with assignment to a variable.
>> https://github.com/pygame/pygame/pull/403
>>
>>
>>
>>
>> On Sat, Feb 24, 2018 at 7:23 PM, Daniel Pope <ma...@mauveweb.co.uk>
>> wrote:
>>
>>> Does the Swizzling have a cost if you're not using it? If not I'd be
>>> tempted to say it should always be on.
>>>
>>>
>>> On Sat, 24 Feb 2018, 18:00 René Dudfield, <ren...@gmail.com> wrote:
>>>
>>>> Hey hey,
>>>>
>>>> I noticed the pygame.math vectors couldn't be pickled/unpickled.
>>>>
>>>> So that has been added here:
>>>> https://github.com/pygame/pygame/pull/403
>>>>
>>>> Could someone please review?
>>>>
>>>>
>>>> cheers,
>>>>
>>>>
>>>>
>>>> On Sat, Feb 24, 2018 at 10:30 AM, René Dudfield <ren...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hello,
>>>>>
>>>>> I'm going to remove the experimental notice from pygame.math in the
>>>>> docs.
>>>>> https://www.pygame.org/docs/ref/math.html
>>>>>
>>>>> It seems fine to me, and I guess no one has plans to change it?
>>>>>
>>>>>
>>>>> best regards,
>>>>>
>>>>
>>>>
>>

Reply via email to