本文希望能够通过生成器到协程的历程,从这个角度说明一下协程!
递归
我们以斐波拉契数列的运算来说明我们的生成器,对于斐波拉契数列,我们生成其第n个数。首先我们利用递归的方式实现。
import time
def clock(func):
def clocked(*args):
t0 = time.perf_counter()
result = func(*args)
elapsed = time.perf_counter() - t0
name = func.__name__
arg_str = ','.join(repr(arg) for arg in args)
print('[%0.8s] %s(%s) -> %r' %(elapsed,name,arg_str,result))
return result
return clocked
@clock
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 2) + fibonacci(n - 1)
if __name__ == "__main__":
print(fibonacci(6))
我们看看它的打印结果,发现有非常多的重复计算!
[5.299999] fibonacci(0) -> 0
[4.689999] fibonacci(1) -> 1
[4.214800] fibonacci(2) -> 1
[3.120000] fibonacci(1) -> 1
[2.740000] fibonacci(0) -> 0
[2.940000] fibonacci(1) -> 1
[3.490999] fibonacci(2) -> 1
[5.241999] fibonacci(3) -> 2
[0.000112] fibonacci(4) -> 3
[2.399999] fibonacci(1) -> 1
[2.379999] fibonacci(0) -> 0
[2.740000] fibonacci(1) -> 1
[1.655199] fibonacci(2) -> 1
[3.287499] fibonacci(3) -> 2
[2.430000] fibonacci(0) -> 0
[2.740000] fibonacci(1) -> 1
[1.651999] fibonacci(2) -> 1
[3.590000] fibonacci(1) -> 1
[4.510000] fibonac