Написание быстрой функции для проверки элементов в матрице - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь написать функцию, которая проверяет элементы в матрице и возвращает другую матрицу результатов в логических значениях.

Ввод:

X: список2D-возрастной массив, как описано выше.

Выходные данные:

Функция должна возвращать 2D-массив с записями 0 или 1, как описано выше.

Функция должнабегите в 15 раз быстрее, чем этот:

def check_elems(X):
    out = [[0]*len(X[0]) for _ in range(len(X))]
    for i in range(len(X)):
        for j in range(len(X[i])):
            check = X[i][j]
            if check>=14 and check%5==4 and check!=19:
                out[i][j] = 1
    return out

Вот конкретный пример:

  • Человек по крайней мере 14
  • Возраст человека заканчивается в 4 или9
  • И человек не 19

Например, массив возрастов

[[22, 13, 31, 13],
 [17, 14, 24, 22]]

будет иметь выходной массив:

[[0, 0, 0, 0], 
 [0, 1, 1, 0]]

1 Ответ

1 голос
/ 01 мая 2019

Без числа:

X = [[22, 13, 31, 13],
     [17, 14, 24, 22]]

%timeit check_elems(X)
%timeit [[1 if i%5==4 and i>=14 and i!=19 else 0 for i in l] for l in X]

Со стандартным ноутбуком:

2,16 мкс ± 15 нс на цикл (среднее ± стандартное отклонение из 7 прогонов, 100000 циклов в каждом)

911 нс ± 2,23 нс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1000000 циклов каждый)

РЕДАКТИРОВАТЬ

Как любезно отмечено @ user3386109, предыдущий код НЕ удовлетворяет ограничению 15 раз быстрее , требуемому OP, что я как-то неправильно прочитал как 1,5 раза.Я оставляю свой код просто как основу.

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