傅立叶变换:计算缩放作为矢量长度的函数

时间:2015-11-02 02:48:16

标签: python algorithm python-2.7 big-o dft

如果我使用以下定义的函数来计算离散傅里叶变换,我将如何证明计算作为矢量长度的函数缩放为O(N ^ 2)。

def dft(y):
     N = len(y)
     c = np.zeros(N//2+1,complex)
     for k in range(N//2+1):
         for n in range(N):
             c[k] += y[k]*np.exp(-2j*np.pi*k*n/N)
     return c

根据我的理解,如果算法按比例缩放为O(N ^ 2)意味着它是二次的并且循环的运行时间与N的平方成比例。如果N加倍...那么运行时间会增加N * N.

我的第一个想法是运行一个程序,我转换一个长度等于N的值数组,然后将这些值加倍(加倍N),并显示这两者之间的运行时间差为N ^ 2。这是否有意义(或者有不同/更好的方式)?如果是这样,我如何测量python中的运行时间?

谢谢你。

4 个答案:

答案 0 :(得分:0)

运行时?你可以在开始时制作一个计数器,每次完成某项操作都会增加1.因此,在你的第二个for循环中,只需将计数器递增1,当程序完成打印计数器时。这将显示所需的计算量。

definingVars()

答案 1 :(得分:0)

根据您想要测量的时间,您可以使用time.clock(我认为这里最接近您想要的 - 它测量您的程序实际运行的时间份额)或{{1 }}

您只需获得计算完成前后的时间。类似的东西:

datetime.datetime.now

请注意,当你加倍t0 = time.clock() dft() t1 = time.clock() print("Time ellapsed: {0}".format(t1-t0)) 时,你所寻找的是四倍的时间。

答案 2 :(得分:0)

重复计算系数的线

t equation

次。然后你需要显示一个常数M和一个N的值

big o relation

当N接近无穷大时。然后你就显示了

result

答案 3 :(得分:0)

timeit库就是为了这个目的而制作的。

https://docs.python.org/2/library/timeit.html

from timeit import timeit

for i in [10, 100, 1000, ...]:
    y = generate_array(i)
    timeit('dft(y)')