zoukankan      html  css  js  c++  java
  • 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

    第一,错在不用为每一次运算计算运行时间,只要每执行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


        附上美丽的曲线图,经过一段曲折的纠缠,最终水波算法胜出

     

    测试的完整代码,贴在这里,至此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()
  • 相关阅读:
    新手学Python必看的几个练手小项目,轻松不枯燥哦!
    实力讲解,一文读懂Python闭包与装饰器!
    Python必不可少的小技巧,一行代码减少一半内存占用!
    千篇一律的Python爬虫,大神精心总结的爬虫套路!
    Python小技巧:获取Linux系统基本信息
    大数据时代|搭建Python数据分析平台
    利用Python实时接收微博小姐姐动态啦~
    Python爬虫:把爬取到的数据插入到execl中
    正则表达式 元字符
    正则表达式——(2) – 语法
  • 原文地址:https://www.cnblogs.com/yuxc/p/2133654.html
Copyright © 2011-2022 走看看