首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多处理时Sympy/gmpy/gmpy错误

使用多处理时Sympy/gmpy/gmpy错误
EN

Stack Overflow用户
提问于 2014-05-02 00:41:52
回答 1查看 707关注 0票数 0

编辑:这是一个同情的错误。我把讨论转移到了https://github.com/sympy/sympy/issues/7457

我有一个Python程序,它使用sympy来执行一些核心功能,包括取线和形状的交集。此操作需要执行数千次,并且在使用默认的sympy纯Python模块时非常慢。

我试图通过安装gmpy 2.0.3来加快速度(我也尝试过使用gmpy 1.5)。这确实会导致代码在某种程度上加速,但是当使用multiprocessing获得进一步的速度时,程序会与TypeError崩溃。

代码语言:javascript
复制
Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\python27\lib\multiprocessing\pool.py", line 376, in _handle_results
    task = get()
  File "C:\python27\lib\site-packages\sympy\geometry\point.py", line 91, in __new__
    for f in coords.atoms(Float)]))
  File "C:\python27\lib\site-packages\sympy\simplify\simplify.py", line 3839, in nsimplify
    return _real_to_rational(expr, tolerance)
  File "C:\python27\lib\site-packages\sympy\simplify\simplify.py", line 3781, in _real_to_rational
    r = nsimplify(float, rational=False)
  File "C:\python27\lib\site-packages\sympy\simplify\simplify.py", line 3861, in nsimplify
    exprval = expr.evalf(prec, chop=True)
  File "C:\python27\lib\site-packages\sympy\core\evalf.py", line 1300, in evalf
    re = C.Float._new(re, p)
  File "C:\python27\lib\site-packages\sympy\core\numbers.py", line 673, in _new
    obj._mpf_ = mpf_norm(_mpf_, _prec)
  File "C:\python27\lib\site-packages\sympy\core\numbers.py", line 56, in mpf_norm
    rv = mpf_normalize(sign, man, expt, bc, prec, rnd)
TypeError: ('argument is not an mpz', <class 'sympy.geometry.point.Point'>, (-7.07106781186548, -7.07106781186548))

当使用gmpy在单个进程中运行时,以及在不使用gmpy使用multiprocessing.Pool运行时,程序工作良好。

以前有人遇到过这样的问题吗?下面的程序再现了这个问题:

代码语言:javascript
复制
import sympy
import multiprocessing
import numpy

def thread_function(func, data, output_progress=True, extra_kwargs=None, num_procs=None):
    if extra_kwargs:
        func = functools.partial(func, **extra_kwargs)

    if not num_procs:
        num_procs = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=num_procs)
    results = pool.map_async(func, data.T)
    pool.close()

    pool.join()
    return results.get()

def test_fn(data):
    x = data[0]
    y = data[1]
    circle = sympy.Circle((0,0), 10)
    line = sympy.Line(sympy.Point(0,0), sympy.Point(x,y))
    return line.intersection(circle)[0].evalf()

if __name__ == '__main__':
    data = numpy.vstack((numpy.arange(1, 100), numpy.arange(1, 100)))

    print thread_function(test_fn, data) #<--- this line causes the problem
#    print [test_fn(data[:,i]) for i in xrange(data.shape[1])] #<--- this one runs without errors
EN

回答 1

Stack Overflow用户

发布于 2014-05-04 02:19:34

我已经验证了gmpy对象是可选择的,使用gmpympmath.mpf对象也是可选择的。

man参数到mpf_normalize()不是gmpy对象时,就会发生错误。如果我强迫man成为一个mpz,那么我就不会再得到一个错误。但答案与单一流程版本不同。

单一进程版本:

点(-223606797749979/50000000000000,-223606797749979/250000000000)

多进程版本:

点(-7.07106781186548,-7.07106781186548)

Point()中使用的两种类型都是不同的(rational和float),并且值是不同的(-223606797749979/50000000000000是-4.47213595499958)。

我还在研究,如果我发现了根本原因,我会更新这个答案。

更新#1:不同的值是由示例代码中的错误引起的。线程函数传递的值与非线程版本不同.

我仍在追踪多处理触发异常的原因。我将问题简化为以下示例:

代码语言:javascript
复制
import sympy
import multiprocessing
import numpy

def thread_function(func, data, output_progress=True, extra_kwargs=None, num_procs=None):
    if extra_kwargs:
        func = functools.partial(func, **extra_kwargs)

    if not num_procs:
        num_procs = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=num_procs)
    results = pool.map_async(func, data)
    pool.close()

    pool.join()
    return results.get()

def test_fn(data):
    return sympy.Point(0,1).evalf()

if __name__ == '__main__':
    test_size = 10
    print [test_fn(None) for i in xrange(1, test_size)] #<--- this one runs without errors
    print thread_function(test_fn, [None] * (test_size - 1)) #<--- this line causes the problem
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23419025

复制
相关文章

相似问题

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