将数字乘以顺序,
for i in range(1, n + 1):
r *= i
return r
很快就会产生一个很大的数字(如数万个比特),然后你就会有一个很大的数字和一个小数字的乘法.其中至少有一个因素很大的乘法很慢.
例如,通过减少涉及大数的乘法次数,可以大大加快速度
def range_prod(lo,hi):
if lo+1 < hi:
mid = (hi+lo)//2
return range_prod(lo,mid) * range_prod(mid+1,hi)
if lo == hi:
return lo
return lo*hi
def treefactorial(n):
if n < 2:
return 1
return range_prod(1,n)
产生,计时100000! %100019(我首先尝试了len(str(fun(100000)),但转换为字符串的速度非常慢,因此差异看起来比它小:)
$python factorial.py
81430
math.factorial took 4.06193709373 seconds
81430
factorial took 3.84716391563 seconds
81430
treefactorial took 0.344486951828 seconds
所以超过10倍的速度为100000!