gpt4 book ai didi

python - 代码优化python

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:07 24 4
gpt4 key购买 nike

我编写了以下函数来根据 3 轴加速度计信号 (X,Y,Z) 估计方向

X.shape
Out[4]: (180000L,)
Y.shape
Out[4]: (180000L,)
Z.shape
Out[4]: (180000L,)

def estimate_orientation(self,X,Y,Z):

sigIn=np.array([X,Y,Z]).T
N=len(sigIn)
sigOut=np.empty(shape=(N,3))
sigOut[sigOut==0]=None
i=0
while i<N:
sigOut[i,:] = np.arccos(sigIn[i,:]/np.linalg.norm(sigIn[i,:]))*180/math.pi
i=i+1

return sigOut

用 180000 个样本的信号执行这个函数需要相当长的时间(~2.2 秒)...我知道它不是用“pythonic 方式”编写的...你能帮我优化执行时间吗?

谢谢!

最佳答案

开始方法

使用 broadcasting 后的一种方法, 就像这样 -

np.arccos(sigIn/np.linalg.norm(sigIn,axis=1,keepdims=1))*180/np.pi

进一步优化-I

我们可以使用np.einsum 来替换np.linalg.norm 部分。因此:

np.linalg.norm(sigIn,axis=1,keepdims=1)

可以替换为:

np.sqrt(np.einsum('ij,ij->i',sigIn,sigIn))[:,None]

进一步优化-II

numexpr module 可以带来进一步的提升,它非常适用于大型数组和涉及 trigonometrical 函数的操作。在我们的例子中是 arcccos。因此,我们将使用前面优化部分中使用的 einsum 部分,然后在其上使用 numexpr 中的 arccos

因此,实现看起来像这样 -

import numexpr as ne

pi_val = np.pi
s = np.sqrt(np.einsum('ij,ij->i',signIn,signIn))[:,None]
out = ne.evaluate('arccos(signIn/s)*180/pi_val')

运行时测试

方法-

def original_app(sigIn):
N=len(sigIn)
sigOut=np.empty(shape=(N,3))
sigOut[sigOut==0]=None
i=0
while i<N:
sigOut[i,:] = np.arccos(sigIn[i,:]/np.linalg.norm(sigIn[i,:]))*180/math.pi
i=i+1
return sigOut

def broadcasting_app(signIn):
s = np.linalg.norm(signIn,axis=1,keepdims=1)
return np.arccos(signIn/s)*180/np.pi

def einsum_app(signIn):
s = np.sqrt(np.einsum('ij,ij->i',signIn,signIn))[:,None]
return np.arccos(signIn/s)*180/np.pi

def numexpr_app(signIn):
pi_val = np.pi
s = np.sqrt(np.einsum('ij,ij->i',signIn,signIn))[:,None]
return ne.evaluate('arccos(signIn/s)*180/pi_val')

时间 -

In [115]: a = np.random.rand(180000,3)

In [116]: %timeit original_app(a)
...: %timeit broadcasting_app(a)
...: %timeit einsum_app(a)
...: %timeit numexpr_app(a)
...:
1 loops, best of 3: 1.38 s per loop
100 loops, best of 3: 15.4 ms per loop
100 loops, best of 3: 13.3 ms per loop
100 loops, best of 3: 4.85 ms per loop

In [117]: 1380/4.85 # Speedup number
Out[117]: 284.5360824742268

280x 在那里加速!

关于python - 代码优化python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294474/

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