zoukankan      html  css  js  c++  java
  • 第三次作业——效能分析

    此作业的要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2145]

    该作业git地址为:https://git.coding.net/qiaojingyu/wf_proFile.git

    要求0:以 战争与和平 作为输入文件,重读向由文件系统读入。连续三次运行,给出每次消耗时间、CPU参数。

    因为本次作业使用的是python语言,所以使用命令行输入以下代码:

    python -m cProfile wf.py -s < war_and_peace.txt

    得到的运行时间分别如下:

    1.第一次运行:

    2.第二次运行:

    3.第三次运行:

    次数

    时间(s

    1

    0.614

    2

    0.636

    3

    0.622

    平均

    0.624

    CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz

     

     

     要求1:要求1 给出你猜测程序的瓶颈。你认为优化会有最佳效果,或者在上周在此处做过优化。

    (1)sorted()函数对词频进行排序时会比较耗时,所以上周已经进行优化。将读入的数据存入两个字典,分两部分排序,最后合并排序。

    (2)猜测将读取的文件进行小写转换、字符转换后存入字典这一操作会耗时较长。但是上述操作在词频统计中是必须操作,猜想可以优化标点符号替换操作(将标点符号封装起来)。

            # 单词格式化:去掉分词之后部分英文前后附带的标点符号
            for word in y:
                # last character of each word
                word1 = word
    
                # use a list of punctuation marks
                while True:
                    lastchar = word1[-1:]
                    if lastchar in [",", ".", "!", "?", ";", '"',"-","*","%"]:
                        word2 = word1.rstrip(lastchar)
                        word1 = word2
                    else:
                        word2 = word1
                        break
    
                while True:
                    firstchar = word2[0:]
                    if firstchar in [",", ".", "!", "?", ";", '"',"-","*","%"]:
                        word3 = word2.lstrip(firstchar)
                        word2 = word3
                    else:
                        word3 = word2
                        break
                        # build a wordList of lower case modified words
                word_list2.append(word3)
              
            #统计词频
            tf = {}
            for word in word_list2:
                word = word.lower()
                    # print(word)
                word = ''.join(word.split())
                if word in tf:
                    tf[word] += 1
                else:
                    tf[word] = 1
            return tf
    

      

    要求2:通过profile 找出程序的瓶颈。给出程序运行中最花费时间的3个函数或代码片段。

    在命令行输入以下代码:

    python -m cProfile -s time wf.py -s < war_and_peace.txt

    该命令可以显示出程序中每个函数调用的次数以及运行时间,并对其按时间长短进行排序,看起来比较直观。

    得到耗时前三名结果如下图红框内所示:

    要求3:根据瓶颈,“尽力而为”地优化程序性能。

    根据要求1中对程序瓶颈的猜想,优化后的代码如下所示:

     while True:
                    lastchar = word1[-1:]
                    for lastchar in '
     .,"':
                        word2 = word1.rstrip(lastchar)
                        word1 = word2
                    else:
                        word2 = word1
                        break
    
                while True:
                    firstchar = word2[0:]
                    for lastchar in '
     .,"':
                        word3 = word2.lstrip(firstchar)
                        word2 = word3
                    else:
                        word3 = word2
                        break
                        # build a wordList of lower case modified words
                word_list2.append(word3)
    

      

    要求4:再次profile,给出在要求1 中的最花费时间的3个函数此时的花费。

    再次输入代码:

    python -m cProfile -s time wf.py -s < war_and_peace.txt

    得到结果如下图所示:

    1.第一次运行:

     

    2.第二次运行:

    3.第三次运行:

    次数

    时间(s

    1

    0.587

    2

    0.589

    3

    0.582

    平均

    0.586

    CPU参数: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz

    对比可看出平均运行时间减少了0.038s。

    要求5:程序运行时间。

    等待教师测评。

  • 相关阅读:
    Lover
    As long as you love me....
    JavaSE(4)
    JavaSE(2)
    大数据学习之JavaSE(1)
    LeetCode
    PCA和SVD的区别与联系理解
    阿里笔试题(3.23)——走迷宫
    Java单例设计模式的实现
    Maven配置及idea下创建Maven项目详细步骤
  • 原文地址:https://www.cnblogs.com/qjy0330/p/9748086.html
Copyright © 2011-2022 走看看