Skip to main content

Fast, easy, pretty and readable program instrumentation.

Project description

Kepler

Wish you could see stuff like this about your program?

image

Kepler meticulously tracks your program, and creates simply and easily readable reports to help you understand what they're doing.

Kepler is not a replacement for a good profiling tool, nor is it necessarily a great production implementation tool. Kepler is designed to be that go-to tool in your toolbelt for quick and dirty measurements of your programs.

Installing Kepler

pip install kepler

Kepler in action

The first thing you should do with Kepler is annotate a function or two you want to time with @kepler.time, and then add a kepler.report() call to your amin function.

Here's the script that produced the screenshot above:

import kepler, random, time

@kepler.time("do some stuff")
def do_some_stuff():
    split = kepler.stopwatch("watch")
    for i in kepler.time("loop", range(20)):
        with kepler.time("sleep"):
            time.sleep(random.random() / 100)
        if i % 2 == 1:
            with kepler.time("overhead"):
                split("odd")
        else:
            with kepler.time("overhead"):
                split("even")

@kepler.time
def main():
    with kepler.time("sloooow"):
        time.sleep(0.3)
    do_some_stuff()

main()
kepler.report()

Adding custom timers

Custom timers may be implemented with the measurement decorator. This works similarly to Python's contextlib.contextmanager decorator:

  • The decorated function should be a generator
  • It should do any setup it needs to do, and then yield exactly once
  • yield call corresponds exactly to the code to be measured
  • It should return an Event to be added to kepler's log
import time
import kepler
import torch

@kepler.measurement
def time_gpu():
    start_time = time.time_ns()
    start, end = torch.cuda.Event(True), torch.cuda.Event(True)
    start.record()
    yield
    end.record()
    torch.cuda.synchronize()
    return kepler.TimingEvent(start_time, start.elapsed_time(end) * 1e6)


with time_gpu("matmul"):
    _ = torch.rand([2, 2]) @ torch.rand([2, 2])

kepler.report()

Roadmap

✅ Changelog

  • Custom timing measurements
  • Import and export reports as json
  • Report directly from json -- try python -m kepler.report < tests/data/simple_log.json
  • Testing for units, json import and export

🔜 Up next

  • Track system metrics

🌈 Before 1.0

  • Export traces to pandas
  • Flamegraphs
  • Integrate with open-telemetry
  • Track and report other metrics besidings timings
  • Thorough unit testing
  • Docs
  • Examples
  • Logo

Project details


Download files

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

Source Distribution

kepler-0.3.0.tar.gz (141.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kepler-0.3.0-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file kepler-0.3.0.tar.gz.

File metadata

  • Download URL: kepler-0.3.0.tar.gz
  • Upload date:
  • Size: 141.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.3

File hashes

Hashes for kepler-0.3.0.tar.gz
Algorithm Hash digest
SHA256 88927fb03e3354e21d7e75f05842a1d3b0a73a9a0ec003dd3bc204ae0c3f06b1
MD5 e29b87abbe98b9988a52829716601b1c
BLAKE2b-256 c60de26f806e86c64fdb36ad3c8031aa6ae62b2f9c6ff8ca74cb17eb086715cc

See more details on using hashes here.

File details

Details for the file kepler-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: kepler-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.3

File hashes

Hashes for kepler-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 de31972a21e7b2626d7e92d7ab27ab90e2aba396eef7997d99cb3cc9967cca81
MD5 88fa02035e681ed6d252110317bfd1e4
BLAKE2b-256 60ab90d3da48a0e92c20180d2b884f8ca79b763c60e2db8540deb020f1655834

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page