文档
Pyinstrument 是一个 Python 分析器。探查器是一种帮助您优化代码的工具 - 使其更快。为了获得最大的速度提升,您应该关注程序中最慢的部分。 Pyinstrument帮你找到它!
☕️ 不知道从哪里开始?查看来自 calamcode.io 的视频教程!
pip install pyinstrument
Pyinstrument 支持 Python 3.8+。
要从 git checkout 运行 Pyinstrument,需要一个构建步骤。请查看贡献以获取更多信息。
要了解如何使用 pyinstrument 或查看参考,请参阅文档。
pyinstrument script.py
(其中script.py
包含使用pickle
序列化的类)时,您可能会遇到错误,因为序列化机器不知道__main__
在哪里。请参阅此问题以获取解决方法2024 年 10 月 11 日
HTML 渲染器的大量改进!
时间轴模式 - 查看并放大交互式线性时间轴!
HTML 模式现在具有交互选项,而不需要预先设置。
简化了 HTML 页面标题的设计。
HTML 调用堆栈视图支持箭头键导航。
检测“库”代码的方式已更改。以前,如果字符串“/lib/”出现在文件路径中,则被视为库代码(默认情况下会折叠)。现在,pyinstrument 在配置文件时捕获 Python 安装的路径和任何活动的 virtualenv/conda env。存储在那里的文件被视为库。这应该会减少误报。
对 profiler.start() 的调用现在可以传递 target_description 参数,该参数显示在配置文件读数中。
请查看我的博客文章,了解有关新功能的更多信息。
2024 年 9 月 6 日
glom
这样的包的错误,该错误会改变 locals() 字典。 (#336)UnicodeDecodeError
的错误 (#330)2024 年 8 月 5 日
2024 年 8 月 2 日
2024 年 8 月 1 日
with
块或函数/方法装饰器进行分析。这将分析代码并将简短的读数打印到终端中。 (#327)flat
参数,以呈现一个平面函数列表 (#294)2024 年 1 月 26 日
show_all
选项添加到 Profiler.output_html2023 年 11 月 8 日
%pyinstrument
中不需要的变量扩展的错误 (#278)2023 年 10 月 12 日
-c
,允许直接从命令行分析代码,例如python -c
。 (#271)Profiler.write_html
,用于将 HTML 输出直接写入文件。 (#266)2023 年 9 月 7 日
2023 年 9 月 1 日
2023 年 7 月 22 日
__tracebackhide__
删除帧时导致输出中出现[X frames hidden]
的错误 (#255)None
错误 (#254)2023 年 6 月 5 日
-p flat
来启用该模式。此模式显示通过自时间测量的最重帧,这在某些代码库中可能很有用。 (#240)pstats
文件的功能。这是 stdlib 中 cprofile 使用的文件格式。它没有 pyinstrument 配置文件那么详细,但它与更多工具兼容。 (#236)--show-all
选项的细节 - 提供此选项时,pyinstrument 将不再删除 Python 内部框架。 (#239)2022 年 11 月 5 日
__traceback_hide__
局部变量的帧现在将从输出中删除 (#217)--async_mode=enabled
标志运行,Jupyter/IPython magic 现在支持 async/await。 (#212)2022 年 8 月 21 日
--interval
(秒,默认 0.001)来更改 pyinstrument 对程序进行采样的间隔。这对于长时间运行的程序很有用,增加间隔可以减少内存开销。添加命令行选项-p
--render-option
,允许任意设置渲染选项。这允许您通过执行诸如pyinstrument -p processor_options.filter_threshold=0
类的操作,从命令行设置诸如filter_threshold
之类的选项。
以下是该选项的帮助输出:
-p RENDER_OPTION, --render-option=RENDER_OPTION
options to pass to the renderer, in the format
'flag_name' or 'option_name=option_value'. For
example, to set the option 'time', pass '-p
time=percent_of_total'. To pass multiple options, use
the -p option multiple times. You can set processor
options using dot-syntax, like '-p
processor_options.filter_threshold=0'. option_value is
parsed as a JSON value or a string.
添加了在控制台输出中以百分比而非绝对时间形式查看时间的功能。使用 ConsoleRenderer 选项time='percent_of_total'
,或在命令行上使用-p
,例如pyinstrument -p time=percent_of_total
。
添加用于加载和保存 pyinstrument 会话的命令行选项。您可以使用-r session
保存 pyinstrument 会话的原始数据,例如pyinstrument -r session -o session.pyisession myscript.py
。加载是通过--load
进行的,例如pyinstrument --load session.pyisession
。
命令行输出格式是从-o
输出文件扩展名推断出来的。因此,如果您执行pyinstrument -o profile.html myscript.py
,则无需提供-r html
,pyinstrument 将自动使用 HTML 渲染器。或者,如果您执行pyinstrument -o profile.pyisession myscript.py
,它将保存原始会话对象。
将 FastAPI 和 pytest 的使用示例添加到文档中。
修复了使用async_mode=strict
时导致 NotImplementedError 的错误。
添加对 Python 3.11 的支持
%load_ext pyinstrument
,然后在要分析的单元格中使用%%pyinstrument
即可。pyinstrument -r speedscope
进行配置,然后上传到 speedscope Web 应用程序。PYINSTRUMENT_PROFILE_DIR_RENDERER
选项为 Django 中间件文件输出配置渲染器。异步支持! Pyinstrument 现在可以检测异步任务何时触发等待,并跟踪在此等待下在异步上下文之外花费的时间。
例如,这是一个简单的脚本,其中包含一个执行睡眠操作的异步任务:
import asyncio
from pyinstrument import Profiler
async def main ():
p = Profiler ( async_mode = 'disabled' )
with p :
print ( 'Hello ...' )
await asyncio . sleep ( 1 )
print ( '... World!' )
p . print ()
asyncio . run ( main ())
在 Pyinstrument 4.0.0 之前,我们只能看到运行循环中花费的时间,如下所示:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:33:03 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.006 CPU time: 0.001
/ _/ v3.4.2
Program: examples/async_example_simple.py
1.006 _run_once asyncio/base_events.py:1784
└─ 1.005 select selectors.py:553
[3 frames hidden] selectors,
1.005 kqueue.control :0
现在,使用 pyinstrument 4.0.0,我们得到:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:30:43 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.007 CPU time: 0.001
/ _/ v4.0.0
Program: examples/async_example_simple.py
1.006 main async_example_simple.py:4
└─ 1.005 sleep asyncio/tasks.py:641
[2 frames hidden] asyncio
1.005 [await]
有关更多信息,请查看异步分析文档和 Profiler.async_mode 属性。
Pyinstrument 有一个文档站点,包括完整的 Python API 文档!
--show
、 --show-regex
、 --show-all
在命令行上被忽略的错误。output_html()
和open_in_browser()
添加了timeline
选项(布尔值)。pyinstrument -m module
的问题,其中 pyinstrument 在当前目录中找不到模块。Python -> C -> Python
记录为Python -> Python
,但Python -> Python -> C
将被正确归因。 (#103)<__array_function__ internals>
框架在报告中显示为应用程序代码--show
和--show-regex
选项,以标记要显示的某些文件。这有助于分析特定模块的内部情况,同时隐藏其他模块。例如, pyinstrument --show '*/sympy/*' script.py
。Pyinstrument 现在将隐藏您默认使用的库的跟踪。因此,它不会向您显示大量通过外部内容(例如 urllib)内部的框架,而是让您专注于代码。
前 | 后 |
---|---|
要返回到旧的行为,请在命令行上使用--show-all
。
显示隐藏组的“入口”框架,以便您知道哪个调用有问题
还显示了组中非常慢的帧,例如套接字上的“读取”调用
应用程序代码在控制台中突出显示
其他指标显示在跟踪顶部 - 时间戳、样本数、持续时间、CPU 时间
隐藏代码由--hide
或--hide-regex
选项控制 - 匹配代码文件的路径。
--hide=EXPR glob-style pattern matching the file paths whose
frames to hide. Defaults to '*/lib/*'.
--hide-regex=REGEX regex matching the file paths whose frames to hide.
Useful if --hide doesn't give enough control.
支持从命令行输出时间线。
-t, --timeline render as a timeline - preserve ordering and don't
condense repeated calls
因为现在有一些渲染选项,所以您可以使用--load-prev
加载以前的分析会话 - pyinstrument 保留最后 10 个会话。
隐藏组还可以回调应用程序代码,如下所示:
(内部)记录时间线时,帧树现在完全是线性的,允许创建超精确的帧图表。
(内部)HTML 渲染器已被重写为 Vue.js 应用程序。所有控制台改进也适用于 HTML 输出,而且它是交互式的。
(内部)添加了很多单元和集成测试!
哎呀!请参阅#49 了解血淋淋的细节。我希望你喜欢它。
Recorders
已被移除。帧记录现在位于Profiler
对象的内部。这意味着“框架”对象更加通用,这为......铺平了道路。--version
命令行选项添加了对 JSON 输出的支持。使用pyinstrument --renderer=json scriptfile.py
。公关
@iddan 使用 JSON 输出组合了一个交互式查看器!
运行pyinstrument --html
并且不将输出通过管道传输到文件时,pyinstrument 会将控制台输出写入临时文件并在浏览器中打开它。
-m
标志,例如pyinstrument -m module_name
!公关 Pyinstrument 现在可以在with
块中使用。
例如:
profiler = pyinstrument.Profiler()
with profiler:
# do some work here...
print(profiler.output_text())
针对旧版本 Django 的中间件修复
Pyinstrument 使用新的分析模式。 pyintrument 不使用信号,而是使用基于 PyEval_SetProfile 构建的新统计分析器。这意味着不再有主线程限制,使用 Pyinstrument 时不再出现 IO 错误,并且不需要单独的更多“setprofile”模式!
渲染器。用户可以自定义 Pyinstrument 以使用Profiler.output()
上的renderer
参数来使用替代渲染器,或者在命令行上使用--renderer
参数。
录音机。为了支持 Pyinstrument 的其他用例(例如火焰图),pyinstrument 现在具有“时间线”记录器模式。该模式以线性方式记录捕获的帧,因此可以在时间轴上查看程序执行情况。
pyinstrument
命令。现在,您可以通过运行$ pyinstrument script.py
从 shell 分析 python 脚本。这现在相当于python -m pyinstrument
。谢谢@asmeurer!应用程序代码在 HTML 跟踪中突出显示,以便更容易发现
向 Django 界面添加了PYINSTRUMENT_PROFILE_DIR
选项,该选项会将所有请求的配置文件记录到指定文件夹的文件中。对于分析 API 调用很有用。
在 Django 界面中添加了PYINSTRUMENT_USE_SIGNAL
选项,以便在信号模式出现问题时使用。
设置开发环境:
virtualenv --python=python3 env
. env/bin/activate
pip install --upgrade pip
pip install -r requirements-dev.txt
pre-commit install --install-hooks
要获得一些示例输出:
pyinstrument examples/wikipedia_article_word_count.py
运行测试:
pytest
要在本地运行 linting 检查:
pre-commit run --all-files
一些预提交检查,例如isort
或black
,将自动修复它们发现的问题。因此,如果上面的命令返回错误,请尝试再次运行它,第二次可能会成功:)
运行所有检查可能会很慢,因此您还可以单独运行检查,例如,格式化未通过isort
或black
检查的源代码:
pre-commit run --all-files isort
pre-commit run --all-files black
要诊断pyright
检查失败的原因:
pre-commit run --all-files pyright
HTML 渲染器的工作原理是将示例的 JSON 表示形式与 Javascript“包”嵌入到可在任何 Web 浏览器中查看的 HTML 文件中。
要编辑 html 渲染器样式,请执行以下操作:
cd html_renderer
npm ci
npm run serve
当在没有顶级window.profileSession
对象的情况下启动时,它将获取示例配置文件,以便您可以使用它。
要编译 JS 应用程序并将其捆绑回 pyinstrument python 工具中:
bin/build_js_bundle.py [--force]