Большая производительность в операциях с большими списками в Python - PullRequest
0 голосов
/ 01 ноября 2018

Я занимаюсь разработкой небольшого программного обеспечения для проекта колледжа, и у меня возникла проблема: у кода слишком низкая производительность.

Это программное обеспечение для редактирования изображений, а изображение представляет собой большой трехмерный список (основной список - это целое изображение, каждый список внутри него - горизонтальная линия, а каждый список внутри него - пиксель, содержащий три элемента).

Мне нужно сделать попиксельные корректировки, например, умножив их все на константу, чтобы это выглядело как

for y in range(0,len(image)): 
    for x in range (0,len(image[0])):
        for c in range (0,3):
            im[y][x][c] = (im[y][x][c])*a

Где image - 3-й список
len(image) - количество горизонтальных линий на изображении (размер по вертикали)
len(image[0]) - количество пикселей в горизонтальной линии (размер по горизонтали)
и c является компонентом пикселя (от 0 до 2).

Этот цикл занимает несколько минут, чтобы просмотреть одно изображение с разрешением 12 Мп, и количество изображений, которое мне нужно обработать, составляет порядка сотен, так что это просто невозможно.

Что я могу сделать, чтобы добиться большей производительности? Даже редактирование программного обеспечения занимает несколько секунд, потому что это может быть довольно большой операцией, но этот код слишком медленный.

Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Я также (как в комментариях) предлагаю использовать Numpy. Пример кода будет выглядеть примерно так:

import numpy as np

im = np.array(image,dtype="float16")

# Define your custom function
def myFunc(x,a):
    x = x * a
    return x

# Vectorise function
vfunc = np.vectorize(myFunc)

# Apply function to the array with the parameter a = 5
im = vfunc(im,5)

Я сравнил время для векторизованной функции NumPy и вложенных циклов для массива размером, примерно эквивалентным 12-мегапиксельному изображению: 4242 x 2828 x 3.

Вложенные циклы занимали 99 секунду, в то время как numpy занимал 6,5 сек.

Для справки приведем вопрос об эффективности числовых функций: Наиболее эффективный способ отобразить функцию в массиве пустышек

Для простых функций, таких как умножение, использование простых функций является самым быстрым.

# Multiply each element by 5
im = im * 5

Этот код занял всего 0,5 секунды на моей машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...