Skip to main content

A profiling tool that can visualize python code in flame graph

Project description

CodeSnap

build pypi

CodeSnap is a light-weighted deterministic debugging/profiling tool that can trace and visualize python code. The major data CodeSnap displays is FEE(function entry/exit), or equivalently, the call stack.

Unlike traditional flame graph, which is normally generated by sampling profiler, CodeSnap can display every function executed and the corresponding entry/exit time from the beginning of the program to the end, which is helpful for programmers to catch sporatic performance issues.

With CodeSnap, the programmer can intuitively understand what their code is doing and how long each function takes.

You can take a look at the demo result of an example program running recursive merge and quick sort algorithm.

trace viewer is used to display the stand alone html data.

Requirements

CodeSnap requires python 3.5+. No other package is needed. For now, CodeSnap binary on pip only supports CPython + Linux. However, in theory the source code can build on Windows/MacOS.

Install

The prefered way to install CodeSnap is via pip

pip install codesnap

You can also download the source code and build it yourself.

Usage

There are a couple ways to use CodeSnap

Command Line

The easiest way to use CodeSnap it through command line. Assume you have a python script to profile and the normal way to run it is:

python3 my_script.py

You can simply use CodeSnap as

python3 -m codesnap my_script.py

which will generate a result.html file in the directory you run this command. Open it in browser and there's your result.

If your script needs arguments like

python3 my_script.py arg1 arg2

Just feed it as it is to CodeSnap

python3 -m codesnap my_script.py arg1 arg2

You can also specify the tracer to be used in command line by passing --tracer argument. c tracer is the default value, you can use python tracer instead

python3 -m codesnap --tracer c my_script.py
python3 -m codesnap --tracer python my_script.py

You can specify the output file using -o or --output_file argument. The default output file is result.html. Two types of files are supported, html and json.

python3 -m codesnap -o other_name.html my_script.py
python3 -m codesnap -o other_name.json my_script.py

Inline

Sometimes the command line may not work as you expected, or you do not want to profile the whole script. You can manually start/stop the profiling in your script as well.

First of all, you need to import CodeSnap class from the package, and make an object of it.

from codesnap import CodeSnap

snap = CodeSnap()

If your code is executable by exec function, you can simply call snap.run()

snap.run("import random;random.randrange(10)")

This will as well generate a result.html file in your current directory. You can pass other file path to the function if you do not like the name result.html

snap.run("import random; random.randrange(10)", output_file = "better_name.html")

When you need a more delicate profiler, you can manually enable/disable the profile using start() and stop() function.

snap.start()
# Something happens here
snap.stop()
snap.save() # also takes output_file as an optional argument

With this method, you can only record the part that you are interested in

# Some code that I don't care
snap.start()
# Some code I do care
snap.stop()
# Some code that I want to skip
snap.start()
# Important code again
snap.stop()
snap.save()

It is higly recommended that start() and stop() function should be in the same frame(same level on call stack). Problem might happen if the condition is not met

Display Result

By default, CodeSnap will generate a stand alone HTML file which you can simply open with Chrome(maybe Firefox?). The front-end uses trace-viewer to show all the data.

However, you can generate json file as well, which complies to the chrome trace event format. You can load the json file on perfetto, which will replace the deprecated trace viewer in the future.

At the moment, perfetto did not support locally stand alone HTML file generation, so I'm not able to switch completely to it. The good news is that once you load the perfetto page, you can use it even when you are offline.

Choose Tracer

The default tracer for current version is c tracer, which introduce a relatively small overhead(worst case 2-3x) but only works for CPython on Linux. However, if there's other reason that you would prefer a pure-python tracer, you can use python tracer using tracer argument when you initialize CodeSnap object.

snap = CodeSnap(tracer="python")

Cleanup of c Tracer

The interface for c trace is almost exactly the same as python tracer, except for the fact that c tracer does not support command line run now. However, to achieve lower overhead, some optimization is applied to c tracer so it will withhold the memory it allocates for future use to reduce the time it calls malloc(). If you want the c trace to free all the memory it allocates while collecting trace, use

snap.cleanup()

Performance

Overhead is a big consideration when people choose profilers. CodeSnap now has a similar overhead as native cProfiler. It works slightly worse in the worst case(Pure FEE) and better in easier case because even though it collects some extra information than cProfiler, the structure is lighter.

Admittedly, CodeSnap is only focusing on FEE now, so cProfiler also gets other information that CodeSnap does not acquire.

An example run for test_performance with Python 3.8 / Ubuntu 18.04.4 on Github VM

fib       (10336, 10336): 0.000852800 vs 0.013735200(16.11)[py] vs 0.001585900(1.86)[c] vs 0.001628400(1.91)[cProfile]
hanoi     (8192, 8192): 0.000621400 vs 0.012924899(20.80)[py] vs 0.001801800(2.90)[c] vs 0.001292900(2.08)[cProfile]
qsort     (10586, 10676): 0.003457500 vs 0.042572898(12.31)[py] vs 0.005594100(1.62)[c] vs 0.007573200(2.19)[cProfile]
slow_fib  (1508, 1508): 0.033606299 vs 0.038840998(1.16)[py] vs 0.033270399(0.99)[c] vs 0.032577599(0.97)[cProfile]

Limitations

CodeSnap uses sys.setprofile() for its profiler capabilities, so it will conflict with other profiling tools which also use this function. Be aware of it when using CodeSnap.

Bugs/Requirements

Please send bug reports and feature requirements through github issue tracker. CodeSnap is currently under development now and it's open to any constructive suggestions.

License

Copyright Tian Gao, 2020.

Distributed under the terms of the Apache 2.0 license.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

codesnap-0.0.5-cp38-cp38-manylinux2010_x86_64.whl (671.3 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

codesnap-0.0.5-cp38-cp38-manylinux1_x86_64.whl (671.3 kB view details)

Uploaded CPython 3.8

codesnap-0.0.5-cp37-cp37m-manylinux2010_x86_64.whl (671.2 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

codesnap-0.0.5-cp37-cp37m-manylinux1_x86_64.whl (671.2 kB view details)

Uploaded CPython 3.7m

codesnap-0.0.5-cp36-cp36m-manylinux2010_x86_64.whl (670.3 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64

codesnap-0.0.5-cp36-cp36m-manylinux1_x86_64.whl (670.3 kB view details)

Uploaded CPython 3.6m

codesnap-0.0.5-cp35-cp35m-manylinux2010_x86_64.whl (670.1 kB view details)

Uploaded CPython 3.5m manylinux: glibc 2.12+ x86-64

codesnap-0.0.5-cp35-cp35m-manylinux1_x86_64.whl (670.1 kB view details)

Uploaded CPython 3.5m

File details

Details for the file codesnap-0.0.5-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 671.3 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 4698da05d593b89f9f792c0c3b3c0838f04180d5dc0569b3e4ec7eec5acb9a22
MD5 1b77f9797009e0ce85ee697bf9057755
BLAKE2b-256 c55246730097cf1dd951ee531c22b76e6f5018353ebf0003b64300be9339bc61

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 671.3 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b5685796add41bad12492af04e08764fe812d0d940bfc823503f3a8029f3ea47
MD5 b67168c1b23d99b9c6b5530d8477a373
BLAKE2b-256 23c0d0cbebd4325dd3aab4fc6db2fb26fb3b21bf7ff68e8546a1b264a9e905b9

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 671.2 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 8fc0e09fd4834ae01e124f470265bcf7477f23243aaea3090bf21cf95336da16
MD5 bbd1a6772df4bc6c2e736e7f72356499
BLAKE2b-256 e691aa9c5db0868d2c3ee9fb2a3ed0472e5fa37e8048cd47ab742e17859a3262

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 671.2 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5409ed107e30607838d9e42f4f5a573b431d0f501aa058aac5bc57b4d5b90de1
MD5 6d8cbb60d053609210131304d17a6624
BLAKE2b-256 3fb48150bcc1e4a75dabec165f035d63d367d617ea2cf99130e533854df1f23f

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 670.3 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 b7b7358610350222c3a4a4da99e4aab050a232bf9440388ca224059d604bcbcf
MD5 4bc75eb1c47102537434492f364e3f3f
BLAKE2b-256 274495f5d6f3e010b18b9104392cda00a815f96aea61a9bc95d7c7afabc3271f

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 670.3 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e31c83d7e3bf3549d9344412da04ede8f0758c74910771b06d12b7e10ff64f64
MD5 79971865d3b6de34499599f304f883f6
BLAKE2b-256 a69dd4f9241e72bff24d40cd94a5a1f04b48931c77c2d65c8767768554afb8ec

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp35-cp35m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp35-cp35m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 670.1 kB
  • Tags: CPython 3.5m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp35-cp35m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3ffd9f425b132ad2165208de14e0b9ee5019dd9e690a394e83ba93ad6b80f54e
MD5 dc6f3ba324865b835fd82b19aa9ddcb9
BLAKE2b-256 b309f236e08ae7720b66b9495afe324db2df70816fb980b7655693df7e403a53

See more details on using hashes here.

File details

Details for the file codesnap-0.0.5-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: codesnap-0.0.5-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 670.1 kB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for codesnap-0.0.5-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9bd207ae0fbcabd4f65a02d13f4918d6d85d84f6eeda20e38960745971c7f8ce
MD5 8075feb44609a2c362c0308c1bdcf801
BLAKE2b-256 5eccd8645571846149ef6488be5fce0d926d8b7566b353eefb038d8425bd2c5b

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