Fast, easy, pretty and readable program instrumentation.
Project description
Kepler
Wish you could see stuff like this about your program?
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
yieldexactly once yieldcall corresponds exactly to the code to be measured- It should return an
Eventto 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88927fb03e3354e21d7e75f05842a1d3b0a73a9a0ec003dd3bc204ae0c3f06b1
|
|
| MD5 |
e29b87abbe98b9988a52829716601b1c
|
|
| BLAKE2b-256 |
c60de26f806e86c64fdb36ad3c8031aa6ae62b2f9c6ff8ca74cb17eb086715cc
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de31972a21e7b2626d7e92d7ab27ab90e2aba396eef7997d99cb3cc9967cca81
|
|
| MD5 |
88fa02035e681ed6d252110317bfd1e4
|
|
| BLAKE2b-256 |
60ab90d3da48a0e92c20180d2b884f8ca79b763c60e2db8540deb020f1655834
|