newoay 发表于 2020-8-17 11:18:41

简单的计算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())


为什么这段代码的计算速度这么慢?

小甲鱼的铁粉 发表于 2020-8-17 11:19:54

你这个是递归,加法运算的求和话不建议用递归

zltzlt 发表于 2020-8-17 11:21:52

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:31:19

本帖最后由 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():



但是用修饰器之后,这个求和的函数就变得很快了啊

小甲鱼的铁粉 发表于 2020-8-17 11:35:18

newoay 发表于 2020-8-17 11:31
但是用修饰器之后,这个求和的函数就变得很快了啊

额。。。这个我也不懂了{:10_297:}

永恒的蓝色梦想 发表于 2020-8-17 12:00:53

newoay 发表于 2020-8-17 11:31
但是用修饰器之后,这个求和的函数就变得很快了啊

你直接执行更快。

newoay 发表于 2020-8-17 15:02:51

永恒的蓝色梦想 发表于 2020-8-17 12:00
你直接执行更快。

{:5_100:}好像是啊
t = Timer('num_sum(30)', 'from __main__ import num_sum')
是因为这句在调用,才变慢的嘛{:10_297:}

永恒的蓝色梦想 发表于 2020-8-17 19:58:58

newoay 发表于 2020-8-17 15:02
好像是啊

是因为这句在调用,才变慢的嘛

实际上程序效率没有问题,但是计时器默认会把程序重复调用 1000000 次,自然是很慢。
3L 的方法使用了缓存,实际只计算了 1 次,所以快。
页: [1]
查看完整版本: 简单的计算30个数的和,为什么这段代码的计算速度这么慢?