Skip to content

gusye1234/tiner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tiner

Block-wise, thread-safety timer for loops

Install

pip install tiner

Usage

Works like a context manager

from tiner import tiner
from time import sleep

with tiner("see this block"):
  sleep(1)
# return the block running time
print(tiner.get('see this block'))

or as a python decorator

@tiner('see this function')
def f():
  #do something

Global mining and grouping

the timing is managed by tiner, not its instances:

# A.py
for _ in range(20):
  with tiner("t1"):
    #do something
...
# B.py
for _ in range(20):
  with tiner("t2"):
    #do something
...
# main.py
tiner.table()
#-------------------------
╒═════════╤═══════════╤════════╕
│ BlockTime(s) │   Hits │
╞═════════╪═══════════╪════════╡
│ t10.02612720 │
├─────────┼───────────┼────────┤
│ t20.013146710 │
╘═════════╧═══════════╧════════╛

tiner internally records the different locations for the same block name and will merge their duration at report. Display the additional infomation with tiner.table(verbose=True):

for _ in range(10):
  with tiner("test:loop"):
    sleep(duration)
  ...
  with tiner("test:loop"):
    sleep(duration)
  
tiner.table(verbose=True)
#-------------------------
test:loop
╒═════════════════════╤════════╤═══════════╤════════╕
│ FileLineTime(s) │   Hits │
╞═════════════════════╪════════╪═══════════╪════════╡
│ tests/test_tiner.py1070.012827910 │
├─────────────────────┼────────┼───────────┼────────┤
│ tests/test_tiner.py1120.013299210 │
╘═════════════════════╧════════╧═══════════╧════════╛

Design for loops

from tiner import tiner
from time import sleep

for _ in range(10):
  #do something
  with tiner("see this loop"):
    sleep(0.1)
  #do something
  
# return the block running time over the loops
print(tiner.get('see this loop'))

Handle asynchronous programs

import os
from tiner import tiner

# tiner will call the synchronize function when the block is over
with tiner("loop", synchronize=torch.cuda.synchronize):
  # machine learning running
  
# return the block running time over the loops
print(tiner.get('loop'))

Easy to use

A timer should be clear and simple

tiner.get(BLOCK_NAME) # return a certain block running time so far
tiner.table([BLOCK1, ...]) # print some blocks' time on a formatted table
tiner.zero([BLOCK1, ...]) # empty some blocks' time
tiner.disable() # disable time logging
tiner.enable() # enable time logging