Part2:比较两个渗透函数的性能
关于该部分的项目描述请见Project2 Percolation in Grids 网格渗透
测试的场景要求如下:
· set n=75
· consider values of p from 0 to 1 in increments of 0.05 (or smaller)
· for each value of p, generate 10 random grids and record for each algorithm the average running time on the ten grids
可是我在编写该部分的测试代码时,遇到了些麻烦,一开始还摸不清头脑。
My Problem that You should Avoid
我的思路是执行每次for循环前,也就是对于每个p值,产生一个当前时间t,然后每发生渗透,记录下时间差time_delta,并设置一个求和变量sum_time,累加每次的执行时间。代码如下,发现我错在哪了么?
def test_time(func): #这是错误的
p = 0
results = []
while p < 1:
print 'Running for p =', p, '...'
sum_time=0
t = time.clock()
for k in range(trial_count):
g = random_grid(size, p)
flow,perc = func(g, trace=False)
if perc:
time_delta = time.clock()-t
sum_time+=time_delta
Aver_time = float(sum_time)/trial_count
print Aver_time
results.append(Aver_time)
p += step
return results
p = 0
results = []
while p < 1:
print 'Running for p =', p, '...'
sum_time=0
t = time.clock()
for k in range(trial_count):
g = random_grid(size, p)
flow,perc = func(g, trace=False)
if perc:
time_delta = time.clock()-t
sum_time+=time_delta
Aver_time = float(sum_time)/trial_count
print Aver_time
results.append(Aver_time)
p += step
return results
第一,错在不用为每一次运算计算运行时间,只要每执行trial_count次,跳出循环,计算一次时间差即可。
第二,算法的执行时间不是仅指发生渗透的情况下啊! 我错了,我真的错了...
正确的代码应该如下:
p = 0
results = []
old_clock = time.clock()
print 'testing', func, '...'
while p < 1:
print 'Running for p =', p, '...'
perc_count = 0
for k in range(trial_count):
g = random_grid(size, p)
flow,perc = func(g,trace=False)
new_clock = time.clock()
results.append((new_clock - old_clock)/trial_count)
old_clock = new_clock
p += step
results = []
old_clock = time.clock()
print 'testing', func, '...'
while p < 1:
print 'Running for p =', p, '...'
perc_count = 0
for k in range(trial_count):
g = random_grid(size, p)
flow,perc = func(g,trace=False)
new_clock = time.clock()
results.append((new_clock - old_clock)/trial_count)
old_clock = new_clock
p += step
附上美丽的曲线图,经过一段曲折的纠缠,最终水波算法胜出!
测试的完整代码,贴在这里,至此Python的网格渗透项目也完全结束
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 10 13:34:21 2011
@author: Nupta
"""
from percolation_wave import *
from my_percolation_recursive import *
from pylab import *
import time
import sys
step = 0.05
trial_count = 10
size = 75
def test_time(func):
p = 0
results = []
old_clock = time.clock()
print 'testing', func, '...'
while p < 1:
print 'Running for p =', p, '...'
perc_count = 0
for k in range(trial_count):
g = random_grid(size, p)
flow,perc = func(g,trace=False)
new_clock = time.clock()
results.append((new_clock - old_clock)/trial_count)
old_clock = new_clock
p += step
return results
if __name__ == '__main__':
sys.setrecursionlimit(250000)
res1 = test_time(percolation_wave)
res2 = test_time(percolation_recursive)
plot(arange(0,1,step), res1, 'b', label='wave')
plot(arange(0,1,step), res2, 'r', label='recursive')
legend()
xlabel('p')
ylabel('Running Time')
title('Running Time')
show()
"""
Created on Wed Aug 10 13:34:21 2011
@author: Nupta
"""
from percolation_wave import *
from my_percolation_recursive import *
from pylab import *
import time
import sys
step = 0.05
trial_count = 10
size = 75
def test_time(func):
p = 0
results = []
old_clock = time.clock()
print 'testing', func, '...'
while p < 1:
print 'Running for p =', p, '...'
perc_count = 0
for k in range(trial_count):
g = random_grid(size, p)
flow,perc = func(g,trace=False)
new_clock = time.clock()
results.append((new_clock - old_clock)/trial_count)
old_clock = new_clock
p += step
return results
if __name__ == '__main__':
sys.setrecursionlimit(250000)
res1 = test_time(percolation_wave)
res2 = test_time(percolation_recursive)
plot(arange(0,1,step), res1, 'b', label='wave')
plot(arange(0,1,step), res2, 'r', label='recursive')
legend()
xlabel('p')
ylabel('Running Time')
title('Running Time')
show()
None