数组中求最大子数组之和并进行单元测试与效能分析
一.题目
输入:一个数组,和它的大小
输出:这个数组中最大子数组的和
例如
二.程序代码
最大连续子数组的特点:
(1)第一个不为负数
(2)如果前面数的累加加上当前数小于当前数,说明这次累加不是最大连续数组;如果前面数的累加加上当前数大于当前数,说明这次累加使最大和值增加了,符合情况。
我们可以根据此特点求连续子数组的最大和,
使用python进行计算
def Summax(lis): maxsum=int(lis[0])#定义存储当前的最大和 presum=0#定义存放之前的累加值 for i in lis: if presum<0: presum=int(i)#如果之前的累加和小于0,则替换当前值进行累加 else: presum+=int(i)#如果是大于等于0的则需要将当前的数加到当前最大子数组中 if presum>maxsum: maxsum=presum return maxsum
三.单元测试
python 中进行单元测试很简单,只需要导入unittest库,unittest是Python单元测试框架,类似于JUnit框架。
unittest中有4个重要的概念:test fixture, test case, test suite, test runner
Testcase:
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
使用unittest编写python的单元测试代码,包括如下几个步骤:
1、编写一个python类,继承 unittest模块中的TestCase类,这就是一个测试类
2、在上面编写的测试类中定义测试方法(这个就是指的测试用例),每个方法的方法名要求以 test 打头,没有额外的参数。 在该测试方法中 调用被测试代码,校验测试结果,TestCase类中提供了很多标准的校验方法,如 最常见的assertEqual。
3、执行 unittest.main() ,该函数会负责运行测试,它会实例化所有TestCase的子类,并运行其中所有以test打头的方法。
测试代码:
import unittest from unittest import TestCase class MaxTest(TestCase): def test_1(self): list1=[-1,2,3,-4] self.assertEqual(Summax(list1),5) def test_2(self): list2=[-1,2,-5,3,-4] self.assertEqual(Summax(list2),3) def test_3(self): list3=[-1,20,-5,30,-4] self.assertEqual(Summax(list3),45) def test_4(self): list4=[-2,-3,-5,-1,-9] self.assertEqual(Summax(list4),-1) if __name__=='__main__': unittest.main()
结果:
四.效能分析
使用cProfile进行效能测试
- cProfile自python2.5以来就是标准版Python解释器默认的性能分析器。
- 其他版本的python,比如PyPy里没有cProfile的。
- cProfile是一种确定性分析器,只测量CPU时间,并不关心内存消耗和其他与内存相关联的信息。
代码如下:
import cProfile #Sum.py def Summax(lis): maxsum=int(lis[0])#定义存储当前的最大和 presum=0#定义存放之前的累加值 for i in lis: if presum<0: presum=int(i)#如果之前的累加和小于0,则替换当前值进行累加 else: presum+=int(i)#如果是大于等于0的则需要将当前的数加到当前最大子数组中 if presum>maxsum: maxsum=presum return maxsum cProfile.run("Summax([-1,2,3,-4])")
结果:

ncalls:函数被调用的次数。如果这一列有两个值,就表示有递归调用,第二个值是原生调用次数,第一个值是总调用次数。
tottime:函数内部消耗的总时间。(可以帮助优化)
percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。
cumtime:之前所有子函数消费时间的累计和。
filename:lineno(function):被分析函数所在文件名、行号、函数名。
浙公网安备 33010602011771号