gpt4 book ai didi

python - 将cProfile结果保存到可读的外部文件中

转载 作者:行者123 更新时间:2023-12-04 13:15:33 25 4
gpt4 key购买 nike

我正在使用cProfile尝试分析我的代码:

pr = cProfile.Profile()
pr.enable()
my_func() # the code I want to profile
pr.disable()
pr.print_stats()


但是,结果太长,无法在Spyder终端中完全显示(看不到运行时间最长的函数调用...)。我也尝试使用保存结果

 cProfile.run('my_func()','profile_results')


但是输出文件的格式不是人类可读的格式(尝试使用后缀 .txt和不使用后缀 .txt)。

因此,我的问题是如何将概要分析结果保存到人类可读的外部文件中(例如以 格式正确显示所有单词)?

最佳答案

更新。您可以使用io.StringIO()获取事件探查器的输出并将其保存到文件中。
这是一个例子:

import cProfile
import pstats
import io


def my_func():
result = []
for i in range(10000):
result.append(i)

return result

pr = cProfile.Profile()
pr.enable()

my_result = my_func()

pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('tottime')
ps.print_stats()

with open('test.txt', 'w+') as f:
f.write(s.getvalue())


运行我们的脚本并打开 test.txt。您将看到可读的结果:

   10002 function calls in 0.003 seconds

Ordered by: internal time

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.002 0.002 0.003 0.003 /path_to_script.py:26(my_func)
10000 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}


我也建议使用 dump_stats + pstats.Stats。这是一个如何使用它的示例。文件结构:

# test_ex.py - just a small web app
import cProfile
import json
from functools import wraps
from flask import Flask

from example.mod1 import func1
from example.mod2 import func2

app = Flask(__name__)

# profiling decorator
def profiling():

def _profiling(f):
@wraps(f)
def __profiling(*rgs, **kwargs):
pr = cProfile.Profile()
pr.enable()

result = f(*rgs, **kwargs)

pr.disable()
# save stats into file
pr.dump_stats('profile_dump')

return result
return __profiling
return _profiling

# demonstration route with profiler
@app.route('/test')
@profiling()
def test():
counter = func1()
dict_data = func2()
result = dict()

for key, val in dict_data.items():
result[key] = val + counter

return json.dumps(result)


if __name__ == '__main__':
app.run(debug=True, port=8083)


示例包-让我们想象这是某种应用程序逻辑。

# example.mod1
def func1():
counter = 0

for i in range(100000):
counter += i

return counter

# example.mod2
def func2():
res = dict()

for i in range(300000):
res['key_' + str(i)] = i

return res


现在让我们运行服务器( python3 test_ex.py)并打开 http://localhost:8083/test。几秒钟后,您将看到很长的json。之后,您将在项目文件夹中看到profile_dump文件。现在在项目文件夹中运行python live解释器,并使用pstats打印我们的转储:

import pstats
p = pstats.Stats('profile_dump')
# skip strip_dirs() if you want to see full path's
p.strip_dirs().print_stats()


stats

您还可以轻松对结果进行排序:

p.strip_dirs().sort_stats('tottime').print_stats()
p.strip_dirs().sort_stats('cumulative').print_stats()
p.strip_dirs().sort_stats().print_stats('mod1')


希望这可以帮助。

关于python - 将cProfile结果保存到可读的外部文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51536411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com