Absurd performance difference between pygame.surfarray.array3d and array2d

Asked

Viewed 47 times

1

Using the pygame.surfarray to control an image as an array, manipulating any element in an array3d is more than 5 times slower than manipulating an element array2d.

See this benchmark:

from datetime import *
import pygame

image = pygame.image.load('8000x8000.png')
arr = pygame.surfarray.array3d(image)

start = datetime.now()
for y in range(8000):
    for x in range(8000):
        if arr[x, y, 0] != 0:
            pass

end = datetime.now()
print(end - start)

In the above case, an image of 8000 x 8000 is read pixel by pixel.

array3d returns the elements in this format: [R, G, B]. Ex: (255, 255, 255) = White.

In the above example, processing 8000 2 elements using array3d takes total time: 0:01:41.996732

Now, doing exactly the same, just changing to array2d:

...
    arr = pygame.surfarray.array2d(image)
...    
            if arr[x, y] != 0:

...

The total time is: 0:00:20.632741, that is to say, more than 5 times faster.

Because that?

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.