- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我开始使用 cProfile
来分析我的 python 脚本。我注意到一些非常奇怪的事情。
当我使用 time
来测量我的脚本的运行时间时,它需要 4.3 秒。
当我使用 python -m cProfile script.py
时,它需要 7.3 秒。
在代码中运行探查器时:
import profile
profile.run('main()')
需要 63 秒!!
我能理解为什么在添加分析时可能需要更多时间,但为什么从外部使用 cProfile
或作为代码的一部分会有如此大的区别?为什么我使用 profile.run
时需要这么多时间?
最佳答案
奇怪的是,您看到的是预期的行为。在introduction to the profilers在 Python 文档的一部分中,它指出与 cProfile
相比,profile
增加了“对分析程序的显着开销”。您看到的区别在于您使用的库,而不是您如何调用它们。考虑这个脚本:
import profile
import cProfile
def nothing():
return
def main():
for i in xrange(1000):
for j in xrange(1000):
nothing()
return
cProfile.run('main()')
profile.run('main()')
cProfile
的输出显示 main 运行大约需要 0.143 秒,而 profile
变体报告为 1.645 秒,长约 11.5 倍。
现在让我们再次将脚本更改为:
def nothing():
return
def main():
for i in xrange(1000):
for j in xrange(1000):
nothing()
return
if __name__ == "__main__":
main()
然后用分析器调用它:
python -m profile test_script.py
报告主要运行时间为 1.662 秒。
python -m cProfile test_script.py
报告主要运行时间为 0.143 秒。
这表明您启动分析器的方式与您在 cProfile
和 profile
之间看到的差异无关。不同之处在于两个分析器如何处理函数调用或返回等“事件”。在这两种情况下,您的执行代码中都有软件 Hook ,这些 Hook 会触发回调以跟踪这些事件并执行更新事件计数器以及启动或停止计时器等操作。但是,profile
模块在 Python 中本地处理所有这些事件,这意味着您的解释器必须离开您的代码,执行回调内容,然后返回以继续您的代码.
cProfile
也会发生同样的事情(执行分析回调),但速度要快得多,因为回调是用 C 语言编写的。看一下两个模块文件 profile.py 和 cProfile.py 展示了一些差异:
Profile
类不继承任何其他类(第 111 行),而 Profile
类在 < strong>cProfile.py(第66行)继承自_lsprof.Profiler
,在C源文件中实现。正如文档所述,cProfile
通常是要走的路,只是因为它主要是用 C 实现的,所以一切都更快。
顺便说一句,您可以通过校准来提高profile
的性能。关于如何做到这一点的详细信息是 available in the docs在 Deterministic Profiling 上的 Python 文档部分中有更多关于所有这些东西是如何/为什么是这样的细节。和 limitations .
cProfile
快得多,因为顾名思义,它大部分是用 C 实现的。这与 profile
模块形成对比,后者必须处理所有 native Python 中的分析回调。无论您是从命令行调用分析器还是在脚本中手动调用,都不会影响两个模块之间的时间差。
关于python - cProfile 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325788/
这个问题在这里已经有了答案: Isn't an Int64 equal to a long in C#? (2 个答案) 关闭 9 年前。 它不应该是一个整数类型吗? 这样,一些使用 int 的函数
当我遇到一些我想知道的事情时,我正忙着解析一个二进制文件。 Stream.Position属性的类型为Int64或long。为什么是这样?因为流中的位置不能为负,所以使用 UInt64 不是更有意义吗
所以第一部分是我从用户那里获得输入,在本例中,输入是“1”作为从另一个函数接收的字符值。 printf ("\nPlease enter 1, 2, 3 or q: "); option =
我正在尝试使用以下代码从 REST 服务返回 JSON: $categories = $categoriesController->listAll(); if($categories){ hea
我阅读了文档,它说 long 是 %li,但打印输出返回为 -2147024891。是什么赋予了? 最佳答案 您甚至没有提供要打印的号码,但我猜您已经无意中发现了签名打印和未签名打印之间的区别。 使用
我正在创建自定义购物车,我正在构建一个查询,该查询从检索我刚刚保存到购物车表中的 session_id 开始。我知道这个值被保存了,我在 mysql 命令行运行这个查询,它返回我需要的但我没有将值放入
我有一个包含 textView 的 scrollView。如果文本很长并且不适合屏幕,我想增加 textView 高度(我想我可以通过添加 NSLayoutConstraint outlet 并修改它
我有一个基本的数据库处理程序类,其中有一个使用 PDO::FETCH_ASSOC 参数返回结果集的公共(public)方法: public function resultSet() { $th
在后台线程中,我调用 PublishSubject.onNext(); 并在主线程中通过 subscribe(PublishSubject.filter(message -> message.getI
我想知道为什么 Amazon Web Services 控制台登录页面有这么长的 url?为什么不只发布数据而不显示其中包含大量数据的冗长 url。以这种方式实现有什么充分的理由吗? 最佳答案 我认为
这个问题在这里已经有了答案: Can I mix MySQL APIs in PHP? (4 个答案) 关闭 6 年前。 希望我犯了一个快速而明显的错误,我浏览了 previous question
我得到了答案:如果我禁用了cookie,那么使用URL重定向我可以传递JSESSIONID,但我的URL已经很长,因为我使用它有约束的GET方法。那怎么办我应该使用我的 session 吗?我希望我的
目前,当我使用 DOMDocument 对象并调用 saveHTML() 时,它会自动添加一些我不需要的 html 标签。我尝试了此处建议的解决方案 ( https://stackoverflow.c
我是一名优秀的程序员,十分优秀!