modelx v0.11.0 (2020年11月21日)#

本次发布引入了以下改进和变更。

功能增强#

性能检查的堆栈跟踪摘要

为了诊断性能瓶颈,生成一份报告显示每次执行中各公式所花费的时间是非常有用的。get_stacktrace() 现在有一个 summarize 选项,当该选项设置为 True 时,get_stacktrace() 会返回一个 dict,其键是被调用单元格的表示字符串,值则是包含这些单元格统计信息的字典。下面的示例代码创建了一个包含两个单元格的Model,并运行该Model以激活堆栈跟踪:

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()

上面的示例代码创建了一个名为df的DataFrame,它显示了foobar单元格被调用的次数、执行公式所花费的时间,以及首次和最后一次进入或离开每个公式的执行时间。

单元格

调用次数

持续时间

首次进入时间

最后退出时间

Model1.Space1.foo(x)

6

0.6097867488861084

1605873067.2099519

1605873068.0203028

Model1.Space1.bar()

1

0.20056414604187012

1605873067.8197386

1605873068.0203028

已删除的对象现在被替换为null对象

当模型内部或外部引用了已删除的对象时,它们现在会被替换为空对象

import modelx as mx

m = mx.new_model()
A = m.new_space("A")
B = m.new_space("B")

B.C = A

del m.A

在上面的示例模型中,Space A 是一个空对象:

>>> A
<UserSpace null object>

>>> B.C
<UserSpace null object>

访问空对象的属性会引发DeletedObjectError错误。

向后不兼容的变更#

  • Cells._is_derived()Cells._is_defined() 现在 是方法而不是属性。

  • Spaces和Cells的repr现在基于它们的点分名称,例如 Model1.B[3].foo(x)>

Bug修复#

  • 修复了在读取由旧版Pandas编写的包含Pandas对象的模型时引发的错误。

  • 修复了在不同平台上读取包含 pathlib.Path 的模型时引发的错误。