简单的计算30个数的和,为什么这段代码的计算速度这么慢?
def num_sum(n:int)->int:assert(n>=0),'n must be >=0'
if n==0:
return 0
else:
return n + num_sum(n-1)
if __name__=='__main__':
from timeit import Timer
t=Timer('num_sum(30)','from __main__ import num_sum')
print('TiME:',t.timeit())
为什么这段代码的计算速度这么慢? 你这个是递归,加法运算的求和话不建议用递归
https://fishc.com.cn/thread-154150-1-1.html
from functools import lru_cache
@lru_cache(maxsize=100)
def num_sum(n: int) -> int:
assert (n >= 0), 'n must be >=0'
if n == 0:
return 0
else:
return n + num_sum(n - 1)
if __name__ == '__main__':
from timeit import Timer
t = Timer('num_sum(30)', 'from __main__ import num_sum')
print('TiME:', t.timeit()) 本帖最后由 newoay 于 2020-8-17 11:37 编辑
小甲鱼的铁粉 发表于 2020-8-17 11:19
你这个是递归,加法运算的求和话不建议用递归
from time import time
from functools import wraps
def record_time(func):
'''un'''
@wraps(func)
def wrapper(*args,**kwargs):
start=time()
result=func(*args,**kwargs)
print(f'{time()-start}秒')
return result
return wrapper
@record_time
def num_sum():
但是用修饰器之后,这个求和的函数就变得很快了啊 newoay 发表于 2020-8-17 11:31
但是用修饰器之后,这个求和的函数就变得很快了啊
额。。。这个我也不懂了{:10_297:} newoay 发表于 2020-8-17 11:31
但是用修饰器之后,这个求和的函数就变得很快了啊
你直接执行更快。 永恒的蓝色梦想 发表于 2020-8-17 12:00
你直接执行更快。
{:5_100:}好像是啊
t = Timer('num_sum(30)', 'from __main__ import num_sum')
是因为这句在调用,才变慢的嘛{:10_297:} newoay 发表于 2020-8-17 15:02
好像是啊
是因为这句在调用,才变慢的嘛
实际上程序效率没有问题,但是计时器默认会把程序重复调用 1000000 次,自然是很慢。
3L 的方法使用了缓存,实际只计算了 1 次,所以快。
页:
[1]