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版本中新增。