Skip to content

Releases: pyutils/line_profiler

Version 5.0.0

23 Jul 21:27
bc6e9c1

Choose a tag to compare

This is a major update to the line-profiler package. All APIs should still be backwards compatible with the 4.x branch, but we decided to bump the the new major version 5.x due to the number of new features and changes in the underlying C code. We do plan to introduce changes in defaults in the next 6.x release in an effort to streamline usage.

Big thanks to @TTsangSC who put an enormous amount of work into this 🙏 .

Highlights

  • New TOML configuration files: control defaults via [tool.line_profiler] in pyproject.toml. See docs for an example.
  • Much better auto-profiling: use -p <modname> or prof-mod in config to profile top-level callables
  • New CLI modes: run modules with -m, inline scripts with -c, and profile from stdin with -
  • Switched to sys.monitoring on Python 3.12+ (with fallback support)
  • Improved support for profiling class methods, properties, async generators, and functools.partial
  • Output now shows qualified names (Python ≥ 3.11)
  • Multiple profiler instances can now be used at the same time
  • Many other fixes and improvements

CHANGELOG

  • FIX: win32 encoding issues

  • ENH: Add support for sys.monitoring (Python >= 3.12)

  • FIX: Fixed issue when calling kernprof with neither the -l nor -b flag; also refactored common methods to LineProfiler and ContextualProfile

  • FIX: Fixed auto-profiling of async function definitions #330

  • ENH: Added CLI argument -m to kernprof for running a library module as a script; also made it possible for profiling targets to be supplied across multiple -p flags

  • FIX: Fixed explicit profiling of class methods; added handling for profiling static, bound, and partial methods, functools.partial objects, (cached) properties, and async generator functions

  • FIX: Fixed namespace bug when running kernprof -m on certain modules (e.g. calendar on Python 3.12+).

  • FIX: Fixed @contextlib.contextmanager bug where the cleanup code (e.g. restoration of sys attributes) is not run if exceptions occurred inside the context

  • ENH: Added CLI arguments -c to kernprof for (auto-)profiling module/package/inline-script execution instead of that of script files; passing '-' as the script-file name now also reads from and profiles stdin

  • ENH: In Python >=3.11, profiled objects are reported using their qualified name.

  • ENH: Highlight final summary using rich if enabled

  • ENH: Made it possible to use multiple profiler instances simultaneously

  • ENH: various improvements related to auto-profiling:

    • kernprof -p target entities are now imported and profiled regardless of
      whether they are directly imported in the run script/module/code (old
      behavior restored by passing --no-preimports)
    • kernprof -v and the new -q now control the verbosity level instead
      of being a boolean, allowing diagnostic outputs or output suppression
    • On-import profiling is now more aggressive so that it doesn't miss entities
      like class methods and properties
    • LineProfiler can now be used as a class decorator
  • FIX: Fixed line tracing for Cython code; superseded use of the legacy tracing system with sys.monitoring

  • FIX: Fixed edge cases where:

    • LineProfiler.get_stats() neglected data from duplicate code objects
      (#348)
    • LineProfiler instances may stop receiving tracing events when multiple
      instances were used (#350)
    • Line events were not reported for raise statements and finally:
      bodies when using sys.monitoring (#355)
  • FIX: Tracing-system-related fixes (#333):

    • LineProfiler now caches the existing sys or sys.monitoring trace
      callbacks in .enable() and restores them in .disable(), instead of
      always discarding them on the way out
    • Also added experimental support for calling (instead of suspending) said
      callbacks during profiling
    • Now allowing switching back to the "legacy" trace system on Python 3.12+,
      controlled by an environment variable
  • ENH: Added capability to parse TOML config files for defaults (#335):

    • kernprof and python -m line_profiler CLI options
    • GlobalProfiler configurations, and
    • profiler output (e.g. LineProfiler.print_stats()) formatting

Merged PRs

New Contributors

Full Changelog: v4.2.0...refs/heads/release

Version 4.2.0

03 Dec 17:15
a646bf0

Choose a tag to compare

Automatic Release Notes.

What's Changed

New Contributors

Full Changelog: v4.1.3...refs/heads/release

Version 4.1.3

28 Apr 22:08
c715356

Choose a tag to compare

Version 4.1.3

  • FIX: duration summary now respects the stripzeros argument.
  • FIX: minor test fixes.
  • ENH: building osx wheels for x86 and arm64.
  • ENH: documentation improvements.
  • ENH: signed wheels are now hosted on github and published as release artifacts.

What's Changed

New Contributors

Full Changelog: v4.1.2...refs/heads/release

Version 4.1.2

02 Nov 23:39
1902bf1

Choose a tag to compare

  • ENH: Add support for Python 3.12 #246
  • ENH: Add osx universal2 and arm64 wheels #251
  • ENH: Fix issue with integer overflow on 32 bit systems #249

Version 4.1.1

22 Aug 02:51
c48f643

Choose a tag to compare

4.1.1

* FIX: ``get_stats`` is no longer slowed down when profiling many code sections #236

Thanks @klauer 

Version 4.1.0

17 Aug 04:32
ecf9c5b

Choose a tag to compare

This new version contains big quality of life improvements.

Highlights

Documentation: We now have readthedocs documentation that covers usage tutorials and the API.

Explicit Decorator: There is now a global profile decorator. In your code import line_profiler and decorate functions with @line_profiler.profile. Your code runs as normal by default. Setting the environment variable LINE_PROFILE=1 will enable profiling. For details see the docs.

Auto-Profiling: Users can now run kernprof with -p <modname> to profile all functions in a module without explicitly decorating them. For details see the docs.

CHANGELOG

  • FIX: skipzeros now checks for zero hits instead of zero time
  • FIX: Fixed errors in Python 3.11 with duplicate functions.
  • FIX: show_text now increases column sizes or switches to scientific notation to maintain alignment
  • ENH: show_text now has new options: sort and summarize
  • ENH: Added new CLI arguments -srm to line_profiler to control sorting, rich printing, and summary printing.
  • ENH: New global profile function that can be enabled by --profile or LINE_PROFILE=1.
  • ENH: New auto-profile feature in kernprof that will profile all functions in specified modules.
  • ENH: Kernprof now outputs instructions on how to view results.
  • ENH: Added readthedocs integration: https://kernprof.readthedocs.io/en/latest/index.html

Thanks to @Erotemic @ta946 @Theelx @notEvil

Version 4.0.3

04 Mar 00:16
6ffb10d

Choose a tag to compare

4.0.3

* FIX: Stop requiring bleeding-edge Cython unless necesasry (for Python 3.12).  #206

Version 4.0.2

09 Dec 15:03
6ee9f63

Choose a tag to compare

  • FIX: AttributeError on certain methods. #191

Version 4.0.1

16 Nov 00:35
623078e

Choose a tag to compare

  • FIX: Profiling classmethods works again. #183

Version 4.0.0

12 Nov 23:42
6f8c36e

Choose a tag to compare

  • ENH: Python 3.11 is now supported.
  • ENH: Profiling overhead is now drastically smaller, thanks to reimplementing almost all of the tracing callback in C++. You can expect to see reductions of between 0.3 and 1 microseconds per line hit, resulting in a speedup of up to 4x for codebases with many lines of Python that only do a little work per line.
  • ENH: Added the -i <# of seconds> option to the kernprof script. This uses the threading module to output profiling data to the output file every n seconds, and is useful for long-running tasks that shouldn't be stopped in the middle of processing.
  • CHANGE: Cython's native cythonize function is now used to compile the project, instead of scikit-build's convoluted process.
  • CHANGE: Due to optimizations done while reimplementing the callback in C++, the profiler's code_map and last_time attributes now are indexed by a hash of the code block's bytecode and its line number. Any code that directly reads (and processes) or edits the code_map and/or last_time attributes will likely break.

Thanks to @Theelx and others for all of their hard work on this!