首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sympy.simplify中的Python内存错误

sympy.simplify中的Python内存错误
EN

Stack Overflow用户
提问于 2013-05-05 09:51:45
回答 1查看 940关注 0票数 1

使用64位Python3.3.1和32 to内存和此函数生成目标表达式1+1/(2+1/(2+1/...))

代码语言:javascript
复制
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

代码语言:javascript
复制
simplify(sqrt2Expansion(100))

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

代码语言:javascript
复制
simplify(sqrt2Expansion(50))

是否有方法配置SymPy以完成此计算?下面是错误消息:

代码语言:javascript
复制
    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: 

编辑:

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

代码语言:javascript
复制
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解释器。我用这个问题创建了新的问题长表达式崩溃SymPy

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-05 15:42:35

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

例如,对我来说:

代码语言:javascript
复制
>>> 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修改Parser.h和用不同的限制重新编译Parser.h之外,实现目标的最好方法可能是首先避免使用字符串。我应该提一下,PyPy解释器可以为我弥补1100年的损失。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16383327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档