如果我使用以下定义的函数来计算离散傅里叶变换,我将如何证明计算作为矢量长度的函数缩放为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中的运行时间?
谢谢你。答案 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)
答案 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)')