Skip to main content

PyPI latest Build Status

drf-viewset-profiler

Decorator to profile all methods from a viewset (and its serializer) line by line. For all methods that were called during a request, an output will be generated showing the number of hits, time (in seconds), lines and the content of each line of a method that was executed

Installation

pip install drf-viewset-profiler

Usage

Decorate the viewset that will be profiled

from drf_viewset_profiler import line_profiler_viewset

@line_profiler_viewset
class SomeViewSet(ViewSet):
    queryset = Model.objects.all()

Set the middleware config in settings.py

MIDDLEWARE = [
    ...
    "drf_viewset_profiler.middleware.LineProfilerViewSetMiddleware"
]

Make requests in this viewset to profile and measure the time in seconds wasted

Configuration

DRF_VIEWSET_PROFILER = {
    "DEFAULT_OUTPUT_GENERATION_TYPE": "drf_viewset_profiler.output.FileOutput",
    "DEFAULT_OUTPUT_LOCATION": "",
    "ENABLE_SERIALIZER_PROFILER": True
}

DEFAULT_OUTPUT_GENERATION_TYPE

  • drf_viewset_profiler.output.FileOutput: generates the output in a txt file with the name of the profiled viewset
  • drf_viewset_profiler.output.StdOutput: generates the output in the console (default)

It's possible to customize by extending the BaseOuput class

DEFAULT_OUTPUT_LOCATION

  • the location to generate the output file with the name of the view that will profiled (default is empty)

ENABLE_SERIALIZER_PROFILER

  • profile the methods from the serializer vinculated with the viewset (default is True)

Output example

Total time: 1.7e-05 s
File: /.pyenv/versions/3.7.4/envs/drf-viewset-profiler/lib/python3.7/site-packages/django/views/generic/base.py
Function: _allowed_methods at line 113

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
113                                               def _allowed_methods(self):
114         1         17.0     17.0    100.0          return [m.upper() for m in self.http_method_names if hasattr(self, m)]

Total time: 0.000158 s
File: /.pyenv/versions/3.7.4/envs/drf-viewset-profiler/lib/python3.7/site-packages/rest_framework/generics.py
Function: get_serializer at line 103

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
103                                               def get_serializer(self, *args, **kwargs):
104                                                   """
105                                                   Return the serializer instance that should be used for validating and
106                                                   deserializing input, and for serializing output.
107                                                   """
108         1         15.0     15.0      9.5          serializer_class = self.get_serializer_class()
109         1         12.0     12.0      7.6          kwargs['context'] = self.get_serializer_context()
110         1        131.0    131.0     82.9          return serializer_class(*args, **kwargs)

Total time: 4e-06 s
File: /.pyenv/versions/3.7.4/envs/drf-viewset-profiler/lib/python3.7/site-packages/rest_framework/generics.py
Function: get_serializer_class at line 112

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
112                                               def get_serializer_class(self):
113                                                   """
114                                                   Return the class to use for the serializer.
115                                                   Defaults to using `self.serializer_class`.
116  
117                                                   You may want to override this if you need to provide different
118                                                   serializations depending on the incoming request.
119  
120                                                   (Eg. admins get full serialization, others get basic serialization)
121                                                   """
122         1          3.0      3.0     75.0          assert self.serializer_class is not None, (
123                                                       "'%s' should either include a `serializer_class` attribute, "
124                                                       "or override the `get_serializer_class()` method."
125                                                       % self.__class__.__name__
126                                                   )
127  
128         1          1.0      1.0     25.0          return self.serializer_class  

...

Total time: 1.5491 s
File: /drf-viewset-profiler/test-drf-project/testapp/views.py
Function: create at line 52

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    52                                               def create(self, request):
    53         1          4.0      4.0      0.0          import time
    54         1    1505235.0 1505235.0     97.2          time.sleep(1.5)
    55         1      43866.0  43866.0      2.8          return super().create(request)  

Contribute

  • Clone this repository
  • Install poetry (pip install poetry)
  • run poetry install
  • run pre-commit install
  • Create your branch, make changes and open the pull request

Metadata

Release files for drf-viewset-profiler 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for drf-viewset-profiler 0.4.0
File Size Uploaded Provenance
drf_viewset_profiler-0.4.0.tar.gz 5.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for drf-viewset-profiler 0.4.0
File Interpreter ABI Platform
drf_viewset_profiler-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 14.6 kB

Release files / drf_viewset_profiler-0.4.0.tar.gz

Download URL drf_viewset_profiler-0.4.0.tar.gz
Size 5.5 kB
Tags Source
SHA-256 checksum
How to use checksums
6454e708305da7e2594e141851abdc795aff42a09ffe6d87b1a12115b85f18bc
BLAKE2b-256 checksum
How to use checksums
eed09706be1c6009eb0e94e64462dd76bc8c3a486e8deb92dd107133e996d5e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.11.0 Darwin/23.2.0

Release files / drf_viewset_profiler-0.4.0-py3-none-any.whl

Download URL drf_viewset_profiler-0.4.0-py3-none-any.whl
Size 9.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
656aba377cc7c18ce46935dd5ca3576f89ffc73a730983a0ecd679e034e23582
BLAKE2b-256 checksum
How to use checksums
098b24617ccb7ef256511826a283d87e21d207163e0a57e06600b4c41191ff7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.11.0 Darwin/23.2.0

Security for drf-viewset-profiler 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page