Nano Hash - криптовалюты, майнинг, программирование

Как сделать необязательный декоратор в Python

У меня есть набор скриптов Python, которые я хотел бы профилировать с помощью kernprof https://github.com/rkern/line_profiler, но я также хочу иметь возможность запускать его во время обычного выполнения без kernprof.

Как можно элегантно игнорировать неопределенный @profile во время выполнения без kernprof? Или любой другой декоратор.

Пример кода:

    @profile
    def hello():
        print('Testing')

    hello()

Работает с:

    kernprof -l test.py

Правильно выполняет профилировщик на методах @profile

Работает с:

    python test.py 

Возвращает ошибку:

    Traceback (most recent call last):
    File "test.py", line 1, in <module>
    @profile
    NameError: name 'profile' is not defined

Хотелось бы избежать появления этой ошибки повсюду, поскольку я хочу, чтобы код выполнялся так, как будто @profile не работает, когда он не вызывается с помощью kernprof.

Спасибо! -Лора

Изменить: в итоге я использовал cProfile с kcachegrind и вообще избегал декораторов.

Использование результатов cProfile с KCacheGrind

python -m cProfile -o profile_data.pyprof run_cli.py

pyprof2calltree -i profile_data.pyprof && qcachegrind profile_data.pyprof.log

Ответы:


1

Определите декоратор без операций, если он не выполняется из kernprof:

if 'profile' not in globals():
    def profile(func):
        return func
28.10.2015

2

Вариант метода, предложенного Дэниелом, заключался бы в использовании следующего однострочника, а затем комментируйте его, в зависимости от вашей потребности в профилировании или нет:

# Optional no-op decorator, comment when you want to profile
def profile(func): return func
13.11.2015
  • Это похоже на тот же ответ. Я действительно искал способ проверить, определен ли декоратор функции, а если нет, то определить его, не изменяя код каждый раз, когда я его запускаю. Ответ Даниила удовлетворяет этим требованиям. 17.11.2015
  • @Laura, это действительно вариант того же самого, и я понимаю, что вы не хотите изменять код. Однако мне показалось, что было бы неплохо показать это как альтернативу тем, кто хочет иметь ручное управление и не хочет проверять / работать со списком globals. 17.11.2015
  • вместо того, чтобы добавлять это как отдельное решение, подумайте о том, чтобы сделать комментарий к исходному решению, что-то вроде эй, Даниэль, вы можете поместить все это в одну строку, чтобы было проще закомментировать это, если вы хотите ручное управление. В качестве отдельного решения не очень элегантно иметь код, который в некоторых ситуациях закомментирован, поскольку это кажется действительно плохим стилем. Это мое мнение. Просто предложение и не оскорбление, но я бы проголосовал против этого ответа, потому что лично мне не нравится видеть закомментированный код в производственном коде. 17.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..