程序运行时间及内存监控

记录R和Python程序运行时间及内存监控相关知识点

Posted by CHY on June 30, 2020

在单细胞软件评估中重要的一环就是软件针对不同细胞数量的数据分析所需要的时间和所占用的内存比较,一个好的软件能够用较少的时间,较少的内存分析较多的数据,故在此记录一下关于监控 R 和 Python 程序运行所需时间和内存的多种方法。

Python

# 1.使用装饰器来衡量函数执行时间
# 定义装饰器
import time
from functools import wraps
def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
        (function.func_name, str(t1-t0))
        )
    return result
  return function_timer
# 将这个装饰器添加到需要测量的函数之前
@fn_timer
def myfunction(...):
# 2.使用timeit模块
python -m timeit -n 4 -r 5 -s "import timing_functions" "timing_functions.random_sort(2000000)"
# 3.使用Unix系统中的time命令
time -p python timing_functions.py
# real表示的是执行脚本的总时间
# user表示的是执行脚本消耗的CPU时间。
# sys表示的是执行内核函数消耗的时间。
# Real执行时间和User+Sys执行时间的差就是消耗在输入/输出和系统执行其他任务时消耗的时间。
# 4.使用cProfile模块
# 了解每个函数和方法消耗了多少时间,以及这些函数被调用了多少次
python -m cProfile -s cumulative timing_functions.py
# 5.使用line_profiler模块
# 给出执行每行代码所需占用的CPU时间
pip install line_profiler
@profile
def random_sort2(n):
  l = [random.random() for i in range(n)]
  l.sort()
  return l
if __name__ == "__main__":
  random_sort2(2000000)
# 6.使用memory_profiler模块
# memory_profiler模块用来基于逐行测量代码的内存使用。使用这个模块会让代码运行的更慢。
pip install memory_profiler
pip install psutil  # 提升memory_profiler性能
python -m memory_profiler timing_functions.py

# 每次运行都要打印内存情况,势必会影响程序输出效果,我们可以将结果通过流输出到文件中
# 通过设定steam参数来设定
from memory_profiler import profile
@profile(precision=4, @profile(precision=4, stream=open('/tmp/memory_profiler.log','w+')))

# memory_profiler中的mprof功能来进行测量的,它的原理是在代码运行过程中每0.1S统计一次内存,并生成统计图。
# 在待检测代码所在目录中打开命令行运行如下代码
mprof run test.py # 结果会生成一个.dat文件,如”mprofile_20160716170529.dat”,里面记录了内存随时间的变化
mprof plot  # 使用该命令以图片的形式展示出来
mprof clean   # 清空所有.dat文件
# 7.使用guppy库
pip install guppy

from guppy import hpy
def random_sort3(n):
  hp = hpy()
  print "Heap at the beginning of the functionn", hp.heap()
  l = [random.random() for i in range(n)]
  l.sort()
  print "Heap at the end of the functionn", hp.heap()
  return l
if __name__ == "__main__":
  random_sort3(2000000)

python timing_functions.py