【发布时间】:2012-05-27 07:59:13
【问题描述】:
我正在尝试使用 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 编写过代码,因此有点难以理解。
非常感谢所有帮助:)
【问题讨论】:
-
为什么不用 C 来编写代码?
-
我以前从未用 C 编写过代码,所以工作量很大。我喜欢 Python 中的代码,但我希望它更快。
-
如果没有 print 语句,它的性能会更好吗?您也可能希望将
alfa和beta实例化为np.zeroes(len(freq))而不是列表,将转换保存到最后np.array并避免附加到列表。 -
是的,没有 print 语句会好一点。当然,我不应该将它粘贴到我的代码中。制作 alfa 和 beta np.zeros(len(freq)) 的问题是,for 循环中的 f 不是整数。
标签: python optimization cython spectrum