gpt4 book ai didi

sympy.simplify 中的 Python 内存错误

转载 作者:行者123 更新时间:2023-12-01 05:44:58 25 4
gpt4 key购买 nike

使用64位Python 3.3.1和32GB RAM以及此函数生成目标表达式1+1/(2+1/(2+1/...)) :

def sqrt2Expansion(limit):
term = "1+1/2"
for _ in range(limit):
i = term.rfind('2')
term = term[:i] + '(2+1/2)' + term[i+1:]
return term

我得到MemoryError调用时:

simplify(sqrt2Expansion(100))

较短的表达式效果很好,例如:

simplify(sqrt2Expansion(50))

有没有办法配置SymPy来完成这个计算?以下是错误消息:

    MemoryError                               Traceback (most recent call last)
<ipython-input-90-07c1e2de29d1> in <module>()
----> 1 simplify(sqrt2Expansion(100))

C:\Python33\lib\site-packages\sympy\simplify\simplify.py in simplify(expr, ratio, measure)
2878 from sympy.functions.special.bessel import BesselBase
2879
-> 2880 original_expr = expr = sympify(expr)
2881
2882 expr = signsimp(expr)

C:\Python33\lib\site-packages\sympy\core\sympify.py in sympify(a, locals, convert_xor, strict, rational)
176 try:
177 a = a.replace('\n', '')
--> 178 expr = parse_expr(a, locals or {}, rational, convert_xor)
179 except (TokenError, SyntaxError):
180 raise SympifyError('could not parse %r' % a)

C:\Python33\lib\site-packages\sympy\parsing\sympy_parser.py in parse_expr(s, local_dict, rationalize, convert_xor)
161
162 code = _transform(s.strip(), local_dict, global_dict, rationalize, convert_xor)
--> 163 expr = eval(code, global_dict, local_dict) # take local objects in preference
164
165 if not hit:

MemoryError:

编辑:

我使用 sympy 表达式而不是字符串编写了一个版本:

def sqrt2Expansion(limit):
x = Symbol('x')
term = 1+1/x
for _ in range(limit):
term = term.subs({x: (2+1/x)})
return term.subs({x: 2})

运行得更好:sqrt2Expansion(100)返回有效结果,但是 sqrt2Expansion(200)产生RuntimeError具有许多回溯页面并挂起 IPython 解释器,并有大量未使用的系统内存。我创建了新问题 Long expression crashes SymPy就这个问题。

最佳答案

SymPy 沿路径使用 eval 将字符串转换为 SymPy 对象,并且 eval 使用内置的 Python 解析器,该解析器有最大限制。这并不是真正的 SymPy 问题。

以我为例:

>>> eval("("*100+'3'+")"*100)
s_push: parser stack overflow
Traceback (most recent call last):
File "<ipython-input-46-1ce3bf24ce9d>", line 1, in <module>
eval("("*100+'3'+")"*100)
MemoryError

缺少修改Parser.h中的MAXSTACK并使用不同的限制重新编译Python,可能达到目的的最佳方法是首先避免使用字符串。 [我应该提到的是,PyPy 解释器对我来说可以达到 ~1100。]

关于sympy.simplify 中的 Python 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com