使用numba的jit可以加速scipy的周期图功能吗?

时间:2016-07-24 19:58:38

标签: python-2.7 scipy numba

我需要加速一个程序,而我的瓶颈是 周期图的计算,(我使用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'

感谢您的帮助。

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