Спектр мощности с Cython

Я пытаюсь оптимизировать свой код с помощью Cython. Он вычисляет спектр мощности, а не использует БПФ, потому что это то, что нам сказали делать в классе. Я пробовал писать код на 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, понять его довольно сложно.

Мы очень ценим любую помощь :)

7
задан jfs 11 June 2012 в 07:58
поделиться