我有一个带有同情心的剧本,表现出奇怪的行为。如果我打开一个新的控制台(在Anaconda,Spyder中的Ipython控制台)并运行该脚本,它似乎不会终止(需要超过1分钟)。
但是,如果我然后中止计算并再次运行脚本,它将在2秒内终止。此外,如果我以交互方式运行每一行,那么它很快。不同之处不在于导入库等的开销(没有导入时计时)。
有人能解释一下这种行为吗? 有人可以运行脚本,看看它在计算机上的行为是否相似?
这是我的剧本
import sympy as sy
from timeit import default_timer as timer
start = timer()
a = sy.symbols("a")
A = sy.Matrix(3,3, a)
c0,c1,c2 = sy.symbols("c0 c1 c2", positive = True)
A = A*sy.diag(1,c1,c2)
equi12 = A[1:,1:].inv()*sy.Matrix([1,1])
equi01 = A[:2,:2].inv()*sy.Matrix([1,1])
equi02 = A[[0,2],[0,2]].inv()*sy.Matrix([1,1])
r_0 = 1 - sy.factor(A[0,1:]*equi12)[0]
r_1 = 1 - sy.factor(A[1,[0,2]]*equi02)[0]
r_2 = 1 - sy.factor(A[2,:2]*equi01)[0]
f_0 = 1
f_1 = 1
f_2 = 1
print("hi")
f_N0 = 1-A[0,0]*sy.factor(sy.Matrix([[1,1]])*equi12)[0]
f_N1 = 1-A[1,1]*sy.factor(sy.Matrix([[1,1]])*equi02)[0]
f_N2 = 1-A[2,2]*sy.factor(sy.Matrix([[1,1]])*equi01)[0]
print("ho")
ND_0 = sy.factor((r_0-f_N0)/(f_0-f_N0))
ND_1 = sy.factor((r_1-f_N1)/(f_0-f_N1))
ND_2 = sy.factor((r_2-f_N2)/(f_0-f_N2))
diff2 = sy.factor(ND_0- ND_1).args[-1]
print("checkpoint, so far so good")
start = timer()
# this is the step that causes difficulties
subs_c2 = sy.solveset(diff2,c2)
end = timer()
print(end-start)`
答案 0 :(得分:3)
SymPy有一个缓存,可以缓存最昂贵的操作。在0.7.6之前的SymPy版本中,缓存是无限制的,这可能导致内存问题。
在0.7.6向上,缓存是一个LRU缓存,它使用更少的内存,但速度稍慢。为了提高速度,你可以安装fastcache包,这是一个用C语言编写的LRU缓存,可以提高性能。
您可以深入了解sympy核心缓存逻辑以达到最低点 Source code for sympy.core.cache