Используя pygame.surfarray
для управления изображением в виде массива, манипуляции с любым элементом в array3d
в более чем в 5 раз медленнее , чем при обработке элемента array2d
.
См. Этот тест:
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)
В вышеупомянутом случае изображение 8000 x 8000 читается попиксельно.
array3d
возвращает элементы в этом формате: [R, G, Б].Пример: (255, 255, 255)
= Белый.
В приведенном выше примере обработка 8000 ^ 2 элементов с использованием array3d занимает общее время: 0:01:41.996732
Теперь, делая то же самое, просто переключаясь наarray2d
:
...
arr = pygame.surfarray.array2d(image)
...
if arr[x, y] != 0:
...
Общее время: 0:00:20.632741
.
Почему это?