Длительное время работы Симпи после открытия новой консоли - PullRequest
0 голосов
/ 05 июня 2018

У меня есть скрипт с sympy, который показывает странное поведение.Если я открываю новую консоль (консоль Ipython в Anaconda, Spyder) и запускаю скрипт, он, похоже, не завершается (это занимает больше 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)`

1 Ответ

0 голосов
/ 05 июня 2018

SymPy имеет кеш, который кеширует самые дорогие операции.В версиях SymPy до 0.7.6 кеш неограничен, что может привести к проблемам с памятью.

Начиная с версии 0.7.6, кеш - это кэш LRU, который использует меньше памяти, но немного медленнее.Чтобы вернуть скорость, вы можете установить пакет fastcache, который представляет собой LRU-кэш, написанный на C, который немного повышает производительность.

Вы можете углубиться в логику кэширования ядра sympy, чтобы поразитьbottom Исходный код sympy.core.cache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...