Skip to main content

Profile code executed by pytest

Project description

pytest-line-profiler

tests PyPI version PyPI - Downloads

line-by-line profiling for code executed by pytest, using line-profiler.

Why?

Line profiler is a wonderful tool to easily identify bottlenecks inside specific functions of your code, and quantify the improvements after a refactor.

Using it is straightforward but required to instrument the functions you want to profile with a "virtual" @profile decorator and then execute "a trigger script" (code that calls the decorated functions somehow) via kernprof.py which works as a python wrapper that understands the decorator, register the functions to be profiled, and print the stats when the script finishes.

Altought it does its job, is a bit invasive: you need to have an special "instrumented" version of your code, and execute it in a way that potentially clashes with the way you do normally (for instance, through a shortcut command from your editor, a test runner, another script, etc.)

Moreover, frequently in real case scenarios, "a trigger script" isn't just a simple function call. You need to prepare input data, connect to external resources, etc. And that's exactly what a test can do, right?

Installation

You can install "pytest-line-profiler" via pip from PyPI.

$ pip install pytest-line-profiler

Usage

Mark your test passing the functions you wants to profile as positional arguments, like @pytest.mark.line_profile.with_args(function1, function2, [...])

If your test exercises any of those functions, you'll get the profile result as a report.

For example:

import pytest

def f(i):
    return i * 10

def g(n=10):
    return sum(f(i) for i in range(10))


@pytest.mark.line_profile.with_args(f, g)
def test_as_mark():
    assert g() == 450

After that test is executed, you'll get the stats from the line profiler instance.

============ Line Profile result for tests/test_line_profiler.py::test_as_mark ============
Timer unit: 1e-06 s

Total time: 4e-06 s
File: /home/tin/lab/pytest-line-profiler/tests/test_line_profiler.py
Function: f at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def f(i):
     5        10          4.0      0.4    100.0      return i * 10

Total time: 3e-05 s
File: /home/tin/lab/pytest-line-profiler/tests/test_line_profiler.py
Function: g at line 7

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     7                                           def g(n=10):
     8         1         30.0     30.0    100.0      return sum(f(i) for i in range(10))

Alternatively, you can run any test passing the function/s to profile from the command line

$ pytest --line-profile path.to.function_to_be profiled [...] 

Contributing

Contributions are very welcome. Tests can be run with [pytest][https://github.com/pytest-dev/pytest], please ensure the coverage at least stays the same before you submit a pull request.

License

Distributed under the terms of the [MIT][http://opensource.org/licenses/MIT] license, "pytest-line-profiler" is free and open source software

Issues

If you encounter any problems, please [file an issue][https://github.com/mgaitan/pytest-line-profiler/issues] along with a detailed description.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest-line-profiler-0.2.1.tar.gz (4.9 kB view details)

Uploaded Source

Built Distribution

pytest_line_profiler-0.2.1-py3-none-any.whl (5.1 kB view details)

Uploaded Python 3

File details

Details for the file pytest-line-profiler-0.2.1.tar.gz.

File metadata

  • Download URL: pytest-line-profiler-0.2.1.tar.gz
  • Upload date:
  • Size: 4.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for pytest-line-profiler-0.2.1.tar.gz
Algorithm Hash digest
SHA256 a3d00809c322ea58e0f1701643d7ad16f2cd3133db4d9f5a4893122cc1593f77
MD5 c56b8717d18faa192115740fc0b96d83
BLAKE2b-256 0de0c20039d9d74f4f4fc537801b0698d8e6141e4c9507e951aadbf40e36830e

See more details on using hashes here.

File details

Details for the file pytest_line_profiler-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_line_profiler-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3cfc38e729fb867ad5ab2674163dcc74eb3256ba77163c248781240851d28705
MD5 d2ffa310ae9c6456fd4ea8c0930d37cb
BLAKE2b-256 6b783a38fefecfe0b1da8d1a626b69b3a1aa5b36ff4fc5eff8729d9fd8630aae

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page