作为问题的一部分,我必须将列表中小于50000
的{{1}}个数字相乘。
我通过分而治之的方法对此进行了优化
10**18
但是它仍然很慢,我想知道是否有什么办法可以提高速度。
一个例子:
def multnum(niz,l,d):
if(l==d):
return niz[l]
return multnum(niz,l,(l+d)//2)*multnum(niz,(l+d)//2+1,d)
l和d变量只是辅助变量。
答案 0 :(得分:0)
也许使用numpy吗?
l = np.random.randint(1, 1000, size=50000)
%timeit np.prod(l)
# 39.9 µs ± 53.7 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
另一方面,使用python
ll = list(l)
%timeit multnum(ll, 0, 50000-1)
# 22.2 ms ± 108 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
因此在这种情况下,numpy的速度要快500倍左右。
答案 1 :(得分:0)
math.fsum(np.log(niz))
,然后取幂---或检查是否可以继续在日志空间中工作。
答案 2 :(得分:-2)
我对l和d所代表的含义有点模糊.Numpy为此内置了一个程序包。
import numpy as np
np.prod(niz)