函数性能统计
函数性能统计
https://superfastpython.com/benchmark-python-code/#Benchmark_with_cProfile
第五章 详细阅读,能够列出每个函数的时间,以及函数中调用的函数的性能
profile 模块使用参考
Python性能分析工具Profile - -零 - 博客园 (cnblogs.com)
函数支持保存日志参数
cProfile模块 使用方法
1)支持某一处函数统计
Python 程序测试 profile and Cprofile-CSDN博客
一 性能(时间)分析
参考文档:【调优工具】python性能分析工具cProfiler_python cprofiler 用法-CSDN博客,主要使用cprofiler例子
二更多性能分析工具
-
cProfiler
统计在整个代码执行过程中,每个函数调用的次数和消耗的时间 -
line_profiler
分析每一行代码的运行时间,方便定位程序运行效率瓶颈 -
memory_profiler
分析每行代码的内存使用情况,以进行内存消耗分析
line_profiler
保存性能报告 # lpf.dump_stats('save_name.lprof')
读取报告 # python -m line_profiler save_name.lprof
如何对line_profiler排序? 由官网学习:line-profiler · PyPI
版本1-基于line_profiler 分析每行代码时间-排序
排序代码
def get_sorted_lpf(obj, k_tuple, topk):
"""
obj 为保存的标准打印 字典对象,里面保存了hits times line
k_tuple,obj字典用元组作为键
topk,排序后选出topk
"""
col = []
tab = obj.__dict__['timings'][k_tuple]
# [(14, 1, 1788), (15, 1, 60235833), (16, 1, 2224), (17, 1, 40), (18, 1, 2537)]
for i in tab:
td = {}
td["line"] = i[0]
td["hits"] = i[1]
td["times"] = i[2]/10000000
col.append(td)
print(col)
from operator import itemgetter
# 按照键对字典进行排序
sorted_data = sorted(col, key=itemgetter('times'),reverse=True)
# 输出排序后的结果
for item in sorted_data[:topk]:
print(item)
return sorted_data
完整实例代码
import re
import time
from line_profiler import LineProfiler
def _swait():
time.sleep(2)
print("---swait---")
def get_str(obj, n):
for i in range(n):
_swait()
re.search("-j-", obj)
def main(n):
print("1111111111111")
get_str("out-j0-j-a", n)
print("2222222222222")
time.time()
re.compile("out-j0-j-a")
def get_sorted_lpf(obj, k_tuple, topk):
"""
obj 为保存的标准打印 字典对象,里面保存了hits times line
k_tuple,obj字典用元组作为键
topk,排序后选出topk
"""
col = []
tab = obj.__dict__['timings'][k_tuple]
# [(14, 1, 1788), (15, 1, 60235833), (16, 1, 2224), (17, 1, 40), (18, 1, 2537)]
for i in tab:
td = {}
td["line"] = i[0]
td["hits"] = i[1]
td["times"] = i[2]/10000000
col.append(td)
print(col)
from operator import itemgetter
# 按照键对字典进行排序
sorted_data = sorted(col, key=itemgetter('times'),reverse=True)
# 输出排序后的结果
for item in sorted_data[:topk]:
print(item)
return sorted_data
if __name__ == "__main__":
lpf = LineProfiler()
lpf.add_function(get_str)
tfunc = lpf(main)
tfunc(3)
lpf.print_stats(sort=True)
# lpf.print_stats(sort_by_time=True)
# lpf.print_stats(sortby='cumulative')
lpf.dump_stats('save_name.lprof')
# lpf.dump_stats('save_name.prof')
obj = lpf.get_stats()
k_tup = ('C:\\Users\\xialiu05\\Documents\\公司任务\\ecosys\\GPT2-large\\chat\\timeparsetool\\lineparsetool.py', 13, 'main')
get_sorted_lpf(obj, k_tup, 10)
# import pstats
# p = pstats.Stats('./save_name.prof')
# p.strip_dirs().sort_stats('Time').print_stats(10)
对于实例化的实例,调用了某个函数,在line_profiler中可能被统计两遍。
类似代码
lf = ListenFile(waitnoneepoch=2000,
waitnonetime=0.002,
targetfilesize=1331700)
logits = lf.listen_targetdir_withcpp(abs_out_dir,
"output.bin",
# epch=10,
# querytime=1,
epch=2000,
querytime=0.002,
# querytime=0.001,
readfunc_pad=args.padding,
readfunc_vocleng=13317,
readfunc_astypes=np.int16,
readfunc_backquant=True,
readfunc_scale=1381.2528076171875,
readfunc=read_output)

这478行即被统计双倍。

times 总的耗时是正确的。
所以求pertime 需要hits/2=实际的hits
浙公网安备 33010602011771号