循环
SICP中对两类迭代——递归与循环——做了详尽的解释。当然,不同于我们在python中通用的for 或者 while 循环,书里介绍的都是函数迭代组成。这里稍微总结一下。递归迭代
def fun(n):
if n == 1: # 循环终止条件
return
else:
return operation(fun(n-1)) # 每次循环时做的动作循环迭代
def fun(n, res): # 分别记录了循环次数和中间变量
if n == 1:
return res
else:
return fun(n-1, operation(res))
大致可以看出来,循环迭代是
的时间复杂度和
的空间复杂度;但是递归循环的空间复杂度如果不加以优化的话则是很可怕的。
实际中除了必须递归处理的例子,上述循环还是很少用的。不过若想好好思考一下循环中需要多加小心的要素,上面二者给出了很好的实例。
性能检测
嗯。。。这是一个我很少考虑的问题。一方面在做编程练习的时候可能不会考虑到各种复杂度;另一方面则是没有仔细的了解过各种性能检测的工具。(逃)今天就接着这个机会先总结下现有的知识和问题吧。
首先搬出Peter Norving。在我并没有学懂的课程中,Peter提出了DRY的编程思想,就是用于不同目的的代码,尽量不要掺杂在一起。因此,用于测试或者debug的代码,应该很容易插入到各个位置并很容易的清除,不会影响正常部分的结构。其中很大一部分,比如时间测试,都可以通过装饰器等各种手段来实现。(所以这一个部分是懒了
其次举一个特别简单的例子吧(汗)。。找素数,比如找10万以内的素数或者第1000个素数之类的,怎么优化性能。SICP告诉我们,数学,是提升效率最显著的方法。我们可以用费马定理,讲每一次素数求解的复杂度降到。
然而,如果不只求解一次的话,我们也是可以用列表的嘛。。。当然这里提到列表,则是为了给出练习的例子:如何从时间和真实操作次数来比较这几种不同的方法。
第一次写日志比较简略,坚持万岁~
PS: 内置数据结构里,哪怕用了copy,只要其中有类似列表这种指向内存的元素,copy了也会出现奇怪的东西。
from copy import deepcopy