【问题标题】:Python: Comparing the speed of NumPy and SymPy ufuncified functionsPython:比较 NumPy 和 SymPy ufuncified 函数的速度
【发布时间】:2016-08-24 08:24:41
【问题描述】:

刚刚写了一个代码来比较一个写为numpy的函数和一个使用来自sympyufuncify的函数的计算速度:

import numpy as np
from sympy import symbols, Matrix
from sympy.utilities.autowrap import ufuncify
u,v,e,a1,a0 = symbols('u v e a1 a0')

dudt = u-u**3-v 
dvdt = e*(u-a1*v-a0)

p = {'a1':0.5,'a0':1.5,'e':0.1}

eqs = Matrix([dudt,dvdt])

numeqs=eqs.subs([(a1,p['a1']),(a0,p['a0']),(e,p['e'])])
print eqs
print numeqs

dudt = ufuncify([u,v],numeqs[0])
dvdt = ufuncify([u,v],numeqs[1])

def syrhs(u,v):
    return dudt(u,v),dvdt(u,v)

def nprhs(u,v,p):
    dudt = u-u**3-v 
    dvdt = p['e']*(u-p['a1']*v-p['a0'])
    return dudt,dvdt

def compare(n=10000):
    import time
    timer_np=0
    timer_sy=0
    error = np.zeros(n)
    for i in range(n):
        u=np.random.random((128,128))
        v=np.random.random((128,128))
        start_time=time.time()
        npcalc=np.ravel(nprhs(u,v,p))
        mid_time=time.time()
        sycalc=np.ravel(syrhs(u,v))
        end_time=time.time()
        timer_np+=(mid_time-start_time)
        timer_sy+=(end_time-mid_time)
        error[i]=np.max(np.abs(npcalc-sycalc))
    print "Max difference is ",np.max(error), ", and mean difference is ",np.mean(error)
    print "Average speed for numpy ", timer_np/float(n)
    print "Average speed for sympy ", timer_sy/float(n)

在我的机器上结果是:

In [21]: compare()
Max difference is  5.55111512313e-17 , and mean difference is  5.55111512313e-17
Average speed for numpy  0.00128133814335
Average speed for sympy  0.00127074036598

欢迎任何关于如何使上述功能更快的建议!

【问题讨论】:

    标签: python python-2.7 numpy sympy


    【解决方案1】:

    经过进一步探索,似乎ufuncify 和常规numpy 函数将提供或多或少相同的计算速度。使用numba 或打印到theano 函数不会产生更快的代码。因此,使事情变得更快的另一个选择是 cython 或包装 cFORTRAN 代码。

    【讨论】:

    • 为什么您认为存在速度问题? nprhs 是直截了当的 numpy,没有耗时的 Python 循环。 p 的字典查找可能会慢一点,但大部分时间都花在编译数学运算上(-** 等)。
    猜你喜欢
    • 2019-03-07
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2011-02-20
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多