@EmilGoryachih

Как можно изменить код, чтобы он работал быстрее?

img - массив на выходе
mask - двумерный 256 * 256 numpy массив состоящий из 1 и 0
на выходе должен получится трехмерный массив составленный из mask, но каждый елемент 0 заменён на [0, 0, 0], а 1 на [255, 255, 255]

for i in mask:
    gg = []
    for x in i:
        if x == 0:
            gg.append([0, 0, 0])
        else:
            gg.append([255, 255, 255])
    img.append(gg)
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
result = numpy.zeros(mask.shape + (3,), dtype=numpy.uint8)
result[mask > 0] = (255, 255, 255)

циклы в питоне - штука медленная. Если есть возможность, лучше использовать индексные операции numpy. Они заметно быстрее, чем тот же цикл в питоне.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@rPman
Не уверен что данный код можно как то ускорить
Например можно сменить python на nuitka и компилировать бинарник из получаемого им c++ кода, вот такие простые вещи там однозначно могут быть быстрее, особенно если вручную ковырять
Как частный случая - написать критичный кусок кода на c++/c и вызывать его из питона, но сразу скажу что если по тупому заменить этот кусок на код си, никакого ускорения не получится, может даже ухудшение.

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

Поясни главную задачу, зачем у тебя исходный массив в виде двумерного числового, когда к примеру подошел какой-нибудь битмап (не уверен что это было бы быстрее но попробовать)? Почему надо генерировать итоговый массив таким? куда пойдут эти 3 числа, это описания RGB colors? а потом они все будут инициализироваться?
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Python это в принципе не тот язык который работает быстро. Но если есть уже готовый вектор примитивов то его наверное можно процессить их альтернативного API написанного на векторных операциях. И Python будет просто посредником при вызове. Разумеется вне цикла. Arrow. Numpy. Numba. Pandas неважно. Их огромное количество.

Тоесть главная задаа - подготовить структуры данных так чтобы они были applicable к альтернативному API.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы