Name | pytest-line-profiler-apn JSON |
Version |
0.1.5
JSON |
| download |
home_page | |
Summary | Profile code executed by pytest |
upload_time | 2022-12-05 19:11:42 |
maintainer | Alexander Puck Neuwirth |
docs_url | None |
author | Martín Gaitán |
requires_python | >=3.8,<4.0 |
license | |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# pytest-line-profiler-apn
[![PyPI version][]][1] [![Python versions][]][1]
line-by-line profiling for code executed by pytest, using [line-profiler](https://github.com/pyutils/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:
```python
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.
[PyPI version]: https://img.shields.io/pypi/v/pytest-line-profiler-apn.svg
[1]: https://pypi.org/project/pytest-line-profiler-apn
[Python versions]: https://img.shields.io/pypi/pyversions/pytest-line-profiler-apn.svg
[pip]: https://pypi.org/project/pip/
[PyPI]: https://pypi.org/project
[pytest]: https://github.com/pytest-dev/pytest
[MIT]: http://opensource.org/licenses/MIT
[file an issue]: https://github.com/APN-Pucky/pytest-line-profiler-apn/issues
Raw data
{
"_id": null,
"home_page": "",
"name": "pytest-line-profiler-apn",
"maintainer": "Alexander Puck Neuwirth",
"docs_url": null,
"requires_python": ">=3.8,<4.0",
"maintainer_email": "alexander@neuwirth-informatik.de",
"keywords": "",
"author": "Mart\u00edn Gait\u00e1n",
"author_email": "gaitan@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c3/75/451ec70d6e0e491e264c65540a5353946d815fc966edf50987e51a22a20d/pytest_line_profiler_apn-0.1.5.tar.gz",
"platform": null,
"description": "# pytest-line-profiler-apn\n\n[![PyPI version][]][1] [![Python versions][]][1]\n\nline-by-line profiling for code executed by pytest, using [line-profiler](https://github.com/pyutils/line_profiler).\n\n## Why?\n\nLine profiler is a wonderful tool to easily identify bottlenecks inside specific functions of your code, and quantify the improvements after a refactor. \n\nUsing it is straightforward but required to instrument the functions you want to profile with a \"virtual\" `@profile` decorator\nand 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. \n\nAltought it does its job, is a bit invasive: you need to have an special \"instrumented\" version of your code, \nand 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.) \n\nMoreover, frequently in real case scenarios, \"a trigger script\" isn't just a simple function call. \nYou need to prepare input data, connect to external resources, etc. And that's exactly what a test can do, right? \n\n## Installation \n\nYou can install \"pytest-line-profiler\" via [pip][] from [PyPI][]:\n\n```\n$ pip install pytest-line-profiler\n```\n\n## Usage\n\n\nMark your test passing the functions you wants to profile as positional arguments, \nlike `@pytest.mark.line_profile.with_args(function1, function2, [...])`\n\nIf your test exercises any of those functions, you'll get the profile result as a report. \n\nFor example:\n\n```python\nimport pytest\n\ndef f(i):\n return i * 10\n\ndef g(n=10):\n return sum(f(i) for i in range(10))\n\n\n@pytest.mark.line_profile.with_args(f, g)\ndef test_as_mark():\n assert g() == 450\n\n```\n\n\nAfter that test is executed, you'll get the stats from the line profiler instance. \n\n```\n============ Line Profile result for tests/test_line_profiler.py::test_as_mark ============\nTimer unit: 1e-06 s\n\nTotal time: 4e-06 s\nFile: /home/tin/lab/pytest-line-profiler/tests/test_line_profiler.py\nFunction: f at line 4\n\nLine # Hits Time Per Hit % Time Line Contents\n==============================================================\n 4 def f(i):\n 5 10 4.0 0.4 100.0 return i * 10\n\nTotal time: 3e-05 s\nFile: /home/tin/lab/pytest-line-profiler/tests/test_line_profiler.py\nFunction: g at line 7\n\nLine # Hits Time Per Hit % Time Line Contents\n==============================================================\n 7 def g(n=10):\n 8 1 30.0 30.0 100.0 return sum(f(i) for i in range(10))\n```\n\n\nAlternatively, you can run any test passing the function/s to profile from the command line\n\n```\n$ pytest --line-profile path.to.function_to_be profiled [...] \n```\n\n\n## Contributing\n\nContributions are very welcome. Tests can be run with [pytest][], please\nensure the coverage at least stays the same before you submit a pull\nrequest.\n\n## License\n\nDistributed under the terms of the [MIT][] license,\n\"pytest-line-profiler\" is free and open source software\n\n## Issues\n\nIf you encounter any problems, please [file an issue][] along with a\ndetailed description.\n\n [PyPI version]: https://img.shields.io/pypi/v/pytest-line-profiler-apn.svg\n [1]: https://pypi.org/project/pytest-line-profiler-apn\n [Python versions]: https://img.shields.io/pypi/pyversions/pytest-line-profiler-apn.svg\n [pip]: https://pypi.org/project/pip/\n [PyPI]: https://pypi.org/project\n [pytest]: https://github.com/pytest-dev/pytest\n [MIT]: http://opensource.org/licenses/MIT\n [file an issue]: https://github.com/APN-Pucky/pytest-line-profiler-apn/issues\n\n",
"bugtrack_url": null,
"license": "",
"summary": "Profile code executed by pytest",
"version": "0.1.5",
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "8bda6d1e3da0443a7762d4645d83a190",
"sha256": "d1ad4b28a1063e8639f09ce8672ea42a4b3d33e34f92e9041c706cf7c91d8b3c"
},
"downloads": -1,
"filename": "pytest_line_profiler_apn-0.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8bda6d1e3da0443a7762d4645d83a190",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4.0",
"size": 5242,
"upload_time": "2022-12-05T19:11:40",
"upload_time_iso_8601": "2022-12-05T19:11:40.437504Z",
"url": "https://files.pythonhosted.org/packages/8d/3d/6ac8f0e31d4b563c24e5c79f66f4bf15f59d39b313c11ac90983618cb300/pytest_line_profiler_apn-0.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"md5": "8838307362c091c461cd495fbd348040",
"sha256": "620b5f16a192ba3e7a77d0ed67d77f3d394d862250df5206cd96e570047f859d"
},
"downloads": -1,
"filename": "pytest_line_profiler_apn-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "8838307362c091c461cd495fbd348040",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4.0",
"size": 5365,
"upload_time": "2022-12-05T19:11:42",
"upload_time_iso_8601": "2022-12-05T19:11:42.511952Z",
"url": "https://files.pythonhosted.org/packages/c3/75/451ec70d6e0e491e264c65540a5353946d815fc966edf50987e51a22a20d/pytest_line_profiler_apn-0.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-12-05 19:11:42",
"github": false,
"gitlab": false,
"bitbucket": false,
"lcname": "pytest-line-profiler-apn"
}