Source code for fastlife.utils

# fastlife.utils
# Utility functions and helpers for the fastlife module
#
# Author:   Benjamin Bengfort <benjamin@bengfort.com>
# Created:  Mon Jul 27 16:13:03 2020 -0400
#
# Copyright (C) 2020 Bengfort.com
# For license information, see LICENSE
#
# ID: utils.py [] benjamin@bengfort.com $

"""
Utility functions and helpers for the fastlife module
"""

##########################################################################
## Imports
##########################################################################

import cProfile

from pstats import Stats
from functools import wraps


try:
    import pandas as pd
except ImportError:
    pd = None


[docs]def sprofile(func): """ Decorator that performs a speed/stack profile of the time spent in each function call from the stack below the wrapped function. Prints the results when done. """ @wraps(func) def wrapper(*args, **kwargs): pr = cProfile.Profile() pr.enable() result = func(*args, **kwargs) pr.disable() Stats(pr).strip_dirs().sort_stats('cumulative').print_stats(20) return result return wrapper
[docs]def load_mprofile(path, name=None): """ Load a memory profile from disk for plotting and comparison. """ if pd is None: raise ImportError("pandas is required to load the memory profile") ref = None times, values = [], [] with open(path, 'r') as f: for line in f: if line.startswith("CMDLINE"): if name is None: name = line.rstrip("CMDLINE").strip() if line.startswith("MEM"): parts = line.split() val, ts = float(parts[1]), float(parts[2]) if ref is None: ref = ts times.append(ts-ref) values.append(val) return pd.Series(values, index=times, name=name)