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,它显示了foo和bar单元格被调用的次数、执行公式所花费的时间,以及首次和最后一次进入或离开每个公式的执行时间。
单元格 |
调用次数 |
持续时间 |
首次进入时间 |
最后退出时间 |
|---|---|---|---|---|
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 的模型时引发的错误。