modelx.get_stacktrace#
- get_stacktrace(summarize=False)[源代码]#
获取堆栈跟踪。
如果
summarize
设置为False
(默认值), 则返回调用堆栈跟踪。堆栈跟踪是一个元组列表, 每个元组代表两种操作类型之一: 压入("ENTER")或弹出("EXIT")调用堆栈。 下表显示了存储在元组元素中的数据。索引
内容
0
"进入"或"退出"
1
堆栈位置
2
时间(自epoch起经过的秒数)
3
表示Cells对象的字符串
4
Cells对象的参数元组
如果
summarize
设置为True
,则返回跟踪的摘要。 该摘要是一个dict
,其键是被调用Cells的表示字符串, 值则是包含以下Cells统计信息的字典。键
值
“calls”
对Cells的调用次数
“duration”
单元格中经过的总时间(秒)
“first_entry_at”
首次进入Cells的时间(自epoch起)
“last_exit_at”
最后一次退出Cells的时间(从epoch开始计算)
在使用
get_stacktrace()
之前,必须通过start_stacktrace()
激活调用堆栈跟踪,否则会引发运行时错误。 当将summarize
设置为True
时, 请确保调用start_stacktrace()
时其参数maxlen
设置为None
, 否则get_stacktrace()
可能会因不完整的跟踪记录而引发错误。- Returns:
一个元组列表,每个元组代表一条堆栈历史记录,或者是一个包含摘要信息的字典。
示例
以下示例代码创建并执行一个示例模型,并将执行过程的跟踪摘要存储为Pandas DataFrame:
import time import pandas as pd import modelx as mx m = mx.new_model() m.time = time @mx.defcells def foo(x): time.sleep(0.1) # Waits 0.1 second return foo(x-1) + 1 if x > 0 else bar() @mx.defcells def bar(): time.sleep(0.2) # Waits 0.2 second return 0 mx.start_stacktrace(maxlen=None) foo(5) df = pd.DataFrame.from_dict( mx.get_stacktrace(summarize=True), orient="index") mx.stop_stacktrace()
该DataFrame展示了每个公式被调用的次数、每个公式消耗的时间、执行首次进入每个公式的时间,以及执行最后一次离开每个公式的时间。
单元格
调用次数
持续时间
首次进入时间
最后退出时间
Model1.Space1.foo(x)
6
0.6097867488861084
1605873067.2099519
1605873068.0203028
Model1.Space1.bar()
1
0.20056414604187012
1605873067.8197386
1605873068.0203028
版本0.11.0变更:summarize 参数已添加。
在0.0.25版本中新增。