pytest-line-profiler-apn
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, please ensure the coverage at least stays the same before you submit a pull request.
License
Distributed under the terms of the MIT license, "pytest-line-profiler" is free and open source software
Issues
If you encounter any problems, please file an issue along with a detailed description.
Metadata
Release files for pytest-line-profiler-apn 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pytest_line_profiler_apn-0.1.5.tar.gz | 5.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytest_line_profiler_apn-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.6 kB
Release files / pytest_line_profiler_apn-0.1.5.tar.gz
| Download URL | pytest_line_profiler_apn-0.1.5.tar.gz |
|---|---|
| Size | 5.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
620b5f16a192ba3e7a77d0ed67d77f3d394d862250df5206cd96e570047f859d
|
|
BLAKE2b-256 checksum How to use checksums |
c375451ec70d6e0e491e264c65540a5353946d815fc966edf50987e51a22a20d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.9.15
|
Release files / pytest_line_profiler_apn-0.1.5-py3-none-any.whl
| Download URL | pytest_line_profiler_apn-0.1.5-py3-none-any.whl |
|---|---|
| Size | 5.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d1ad4b28a1063e8639f09ce8672ea42a4b3d33e34f92e9041c706cf7c91d8b3c
|
|
BLAKE2b-256 checksum How to use checksums |
8d3d6ac8f0e31d4b563c24e5c79f66f4bf15f59d39b313c11ac90983618cb300
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.1 CPython/3.9.15
|