Как эффективно отладить части кода, которые вызываются к концу программы, требующей большого объема вычислений? - PullRequest
1 голос
/ 29 января 2020

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

Возможно, небольшой контекст: я использую куча эвристик для решения проблем маршрутизации транспортных средств. Во время которого создаются сложные объекты, такие как маршруты и транспортные средства. Однако, как и в случае с VRP, время выполнения кода составляет несколько минут и даже медленнее в режиме отладки (IDE - это PyCharm Pro).

Теперь, если я хочу отладить код, который принимает эти сложные объекты В качестве входных данных мне нужно запускать весь код каждый раз, когда я запускаю отладчик. Пока он не достигнет точки разрыва, это займет довольно много времени. Обходной путь, который я использую в данный момент, заключается в отладке не с полными входными данными, а с помощью небольшого вспомогательного образца, чтобы сократить время выполнения. Тем не менее, я действительно хотел бы отладить исходные полные данные.

Может быть, есть какой-то способ сохранить состояния переменных непосредственно перед той частью кода, которую я хочу отлаживать, чтобы каждый раз, когда я выполняю отладчик, который не должен начинаться с нуля, а может просто загрузить переменные и go оттуда? (Я делаю изменения только в будущем от этой воображаемой «переменной точки восстановления».)

Какие-либо другие советы и рекомендации о том, как эффективно отлаживать такие вещи?

1 Ответ

1 голос
/ 29 января 2020

Как комментарии @ el-banto, вы, вероятно, можете выбрать результат сложного вычисления в файл на диске, а затем использовать его.

Мы также можем написать достаточно хорошую функциональную оболочку, которая позволит вам просто удалить Если вам нужно пересчитать вещи (dry -кодированный), выберите файл:

import pickle
import os
import time


def cached_compute(filename, fn):
    if os.path.isfile(filename):
        print(f'Using cached {filename}')
        with open(filename, 'rb') as infp:
            return pickle.load(infp)
    print(f'Computing {fn}')
    res = fn()
    with open(filename, 'wb') as outfp:
        pickle.dump(res, outfp, protocol=-1)
    print('Wrote {filename}')
    return res


def expensive_computation(a, b):
    time.sleep(10)  # pretend this was expensive :)
    return a * b

# previously:
# res = expensive_computation(100, 500)

# with caching:
res = cached_compute('something.pickle', lambda: expensive_computation(100, 500))

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