我需要加速一个程序,而我的瓶颈是 周期图的计算,(我使用scipy实现的那个)。我试图使用numba加快速度。
第一个问题是:尝试使用jit编译函数周期图是否有意义?它尚未优化吗?
如果答案是否定的,那么我有编译问题。这是一个最小版本:
import numpy as np
from scipy.signal import periodogram
from numba import jit
a=np.random.randn(10000)
per_j = jit("f8[5](f8[10000],f8,f8[8],i4, b1,b1,b1,i4)",nopython=True)(periodogram)
res=per_j(a,fs=1.0,window=np.hamming(8),nfft=8,detrend=False,return_onesided=True,scaling='density', axis=-1)
追踪(最近一次呼叫最后一次):
File "periodjit.py", line 5, in <module>
per_j = jit("f8[5](f8[10000],f8,f8[8],i4, b1,b1,b1,i4)",nopython=True)(periodogram)
:
(I removed intermediate messages)
:
TypingError: Untyped global name 'welch'
File "../../anaconda2/lib/python2.7/site-packages/scipy/signal/spectral.py", line 140
Failed at nopython (nopython frontend)
Untyped global name 'welch'
File "../../anaconda2/lib/python2.7/site-packages/scipy/signal/spectral.py", line 140
我认为尝试修改spectral.py是没有意义的,这是我的第一个问题。
最后,是否有更快的建议?
我的软件是:
Python 2.7.12 |Anaconda custom (64-bit)| (default, Jul 2 2016, 17:42:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
:
>>> scipy.__version__
'0.17.1'
>>> numba.__version__
'0.26.0'
>>> numpy.version.version
'1.11.1'
感谢您的帮助。
答案 0 :(得分:3)
你看过periodogram
函数了吗?仅仅将numba
抛出一个函数,而不知道该函数正在做什么,尤其是它正在调用的是什么,这没有多大意义。
代码是:
x = np.asarray(x)
if x.size == 0:
return np.empty(x.shape), np.empty(x.shape)
if window is None:
window = 'boxcar'
if nfft is None:
<bunch of nfft tests>
return welch(x, fs, window, nperseg, 0, nfft, detrend, return_onesided, scaling, axis)
此函数只是welch
的包装器。并welch
调用csd
,后者又使用_spectral_helper
。错误表示它无法对welch
执行任何操作。
在尝试使用scipy/signal/spectral.py
加速任何计算之前,先研究numba
。