Дизайн кода: следует ли вам добавлять свои собственные утверждения везде или разрешать более поздним исключениям возвращать ошибку пользователю?(учитывая производительность) - PullRequest
0 голосов
/ 03 апреля 2019

Если у меня есть какая-то функция, которая вызывает другую функцию, есть ли какие-либо рекомендации относительно того, должен ли я проверять входные данные, которые получает внешняя функция, или я должен просто позволить вызвать исключение позже, когда внутренняя функция завершается с ошибкой из-за плохой работы? вход? Основная проблема заключается в том, что я до некоторой степени беспокоюсь о производительности, поскольку хочу, чтобы этот код работал достаточно быстро (сейчас для запуска всей системы требуется около 2 часов).
Я обычно хотел бы проверить больше входных данных в большем количестве мест, но я не хочу делать это в этом проекте, если он потребует слишком много дополнительных вычислений, так как некоторые из этих функций будут выполняться в некоторых узких циклах, которые будут вызываться многими сотни / тысячи раз.

Вот пример:

# (The actual code here isn't that important for answering the question)
# indices should be a list of integers in the range [0, num_classes)
def gen_data(indices, num_classes):
    assert indices.max() < num_classes, "Err: There is a larger index than the provided number of classes" # should I add this assert?

    # Make a matrix of zeros and for each row, set the corresponding index from indices to a 1
    data = zeros_matrix(height=len(indices), width=num_classes).fillIndices(indices)

    return data

Вместо добавления assert, я могу просто позволить внутренним вызовам функции, и если кто-то позже вызовет эту функцию, но неправильно вычислил num_classes, так что индекс имеет более высокий индекс, чем num_classes, тогда вызов внутренней функции будет ошибка.
Однако, если бы я добавил утверждение, я мог бы дать более описательную ошибку того, что на самом деле не так, а не внутренний вызов функции, просто сказав, что есть некоторая ошибка за пределами границ, о которой сложнее рассуждать.

Итак, если я добавлю, скажем, еще 30 утверждений assert в различных местах кода, нужно ли мне вообще заботиться о потере производительности в этом масштабе? Я чувствую, что дополнительные вычисления из утверждений не будут такими интенсивными, но я не уверен. Я мог профилировать код, но хотел услышать, есть ли какие-либо общие мысли.

...