In [6]: timeit c = nprect(1, x); cosx, sinx = cos(x), sin(x)
1000 loops, best of 3: 242 us per loop
In [7]: timeit eix = np.exp(1j*x); cosx, sinx = eix.real, eix.imag
10000 loops, best of 3: 49.1 us per loop
In [8]: timeit cosx, sinx = cos(x), sin(x)
10000 loops, best of 3: 32.7 us per loop
6条答案
按热度按时间nue99wik1#
我将建议的解决方案与perfplot进行了比较,发现没有什么比显式调用
sin
和cos
更好的了。用于重现绘图的代码:
k4aesqcs2#
你可以使用复数和 ei · φ = cos(φ)+ i · sin(φ) 的事实。
我在这里使用了https://stackoverflow.com/a/27788291/674064的技巧来制作一个
cmath.rect()
版本,它将接受并返回NumPy数组。不过,这并没有在我的机器上获得任何加速:
所需时间约为
在我的测量(50。4μs)。
4sup72z83#
一个纯粹的numpy版本通过复数,eiφ = cosφ + i sinφ,灵感来自das-g的答案。
这比
nprect
快,但仍然比sin
和cos
调用慢:p4tfgftt4#
为了完整起见,另一种将其组合为单个
cos()
调用的方法是准备一个Angular 数组,其中第二个半部分具有pi/2的相移。借用Nico Schlömer的分析代码,我们得到:
所以它比单独的
sin
/cos
调用慢,但在某些(狭义)环境中可能更方便,因为从cos()
开始,它只需要处理单个数组。lfapxunr5#
你可以利用tan(x)包含sin(x)和cos(x)函数的事实。因此,您可以使用tan(x)并使用公共转换函数检索cos(x)和sin(x)。
sh7euo9m6#
我已经算好了时间,它比sin和cos快25%。