Numpy dot()和数组转换性能优化

2024-04-24 23:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有可能在numpy中的这部分代码中优化dotproduts和数组转换,根据profiler,这部分代码占用了我代码运行时间的95%。(我不想使用f2py、cython或pyOpenCl,我只是在学习如何有效地使用numpy)

def evalSeriesInBasi(a,B):
    Y   = dot(a,B[0])
    dY  = dot(a,B[1])
    ddY = dot(a,B[2]) 
    return array([Y,dY,ddY])

def evalPolarForces( R, O ):
    # numexpr doest seem to help it takes 3,644 vs. 1.910 with pure numpy
    G    = 1.0 / (R[0]**2)                     # Gravitational force
    F_O  = R[0] * O[2]     + 2 * R[1] * O[1]   # Angular Kinematic Force = Angular engine thrust 
    F_R  = R[0] * O[1]**2  +     R[2]          
    FTR  = F_R - G                             
    FT2  = F_O**2 + FTR**2                     # Square of Total engine Trust Force ( corespons to propelant consuption for power limited variable specific impulse engine)
    return array([F_O,F_R,G,FTR, FT2]) 

def evalTrajectoryPolar( Rt0, Ot0, Bs, Rc, Oc ):
    Rt = Rt0 +  evalSeriesInBasi(Rc,Bs)
    Ot = Ot0 +  evalSeriesInBasi(Oc,Bs)
    Ft = evalPolarForces( Rt, Ot )
    return Ot, Rt, Ft

其中“B”是存储基函数的形状(3,32128)数组,“a”是这些基函数的系数,而所有其他数组(如Y、dY、ddY、F_O、FüR、G、FTR、FT2)是某个函数在128个采样点的值

据profiler说numpy.core.multiarray.数组和numpy.core公司._多特布拉斯.dot在

^{pr2}$

Tags: 函数numpyreturnbsdef数组otdot
2条回答

您可以通过删除array()调用来加快计算速度,下面是一个示例:

import numpy as np

B = np.random.rand(3, 32, 128)
a = np.random.rand(32, 32)

def f1(a, B):
    Y   = dot(a,B[0])
    dY  = dot(a,B[1])
    ddY = dot(a,B[2]) 
    return array([Y,dY,ddY])

def f2(a, B):
    result = np.empty((B.shape[0], a.shape[0], B.shape[-1]))
    for i in xrange(B.shape[0]):
        np.dot(a, B[i], result[i])
    return result

r1 = f1(a, B)
r2 = f2(a, B)
print np.allclose(r1, r2)

f1()f2()的结果相同,但速度不同:

^{pr2}$

结果是:

1000 loops, best of 3: 1.34 ms per loop
10000 loops, best of 3: 135 µs per loop

怎么样:

def f3(a, B):
    r = np.dot(a, B)
    return np.rollaxis(r, 1)

相关问题 更多 >