Cython でコードを最適化しようとしています。FFT を使用せずに、パワー スペクトルを実行しています。これは、クラスで行うように指示されたものです。Cython でコードを書き込もうとしましたが、違いがわかりません。これが私のコードです
#! /usr/bin/env python
# -*- coding: utf8 -*-
from __future__ import division
cimport numpy as np
import numpy as np
cimport cython
@cython.boundscheck(False)
def power_spectrum(time, data, double f_min, double f_max, double df,w=1 ):
cdef double com,f
cdef double s,c,sc,cc,ss
cdef np.ndarray[double, ndim=1] power
cdef np.ndarray[double, ndim=1] freq
alfa, beta = [],[]
m = np.mean(data)
data -= m
freq = np.arange( f_min,f_max,df )
for f in freq:
sft = np.sin(2*np.pi*f*time)
cft = np.cos(2*np.pi*f*time)
s = np.sum( w*data*sft )
c = np.sum( w*data*cft )
ss = np.sum( w*sft**2 )
cc = np.sum( w*cft**2 )
sc = np.sum( w*sft*cft )
alfa.append( ( s*cc-c*sc )/( ss*cc-sc**2 ))
beta.append( ( c*ss-s*sc )/( ss*cc-sc**2 ))
com = -(f-f_min)/(f_min-f_max)*100
print "%0.3f%% complete" %com
power = np.array(alfa)**2 + np.array(beta)**2
return freq,power,alfa,beta
時間とデータは numpy.loadtxt を介してロードされ、この関数に送信されます。私がする時
cython -a power_spectrum.pyx
.html ファイルは非常に黄色であるため、あまり効率的ではありません。特に for ループ全体とべき乗の計算とすべてを返します。
Cython の公式ガイドを読んでみましたが、C でコーディングしたことがないので、ややわかりにくいです。
すべてのヘルプは非常に高く評価されています:)