开了一家新公司后,sympy的运行时间很长

2024-10-03 17:20:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个sympy的剧本,表现出奇怪的行为。如果我打开一个新控制台(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)`

Tags: 脚本startmatrixprinttimerc2factorc1
1条回答
网友
1楼 · 发布于 2024-10-03 17:20:56

SymPy有一个缓存,用于缓存最昂贵的操作。在0.7.6之前的Symphy版本中,缓存是无限的,这可能会导致内存问题

在0.7.6以上版本中,缓存是一个LRU缓存,它使用的内存较少,但速度稍慢。为了恢复速度,您可以安装包fastcache,这是一个用C编写的LRU缓存,它大大提高了性能

您可以深入到Symphy core缓存逻辑中,以找到底部 Source code for sympy.core.cache

相关问题 更多 >