优化几何分布计算中的平凡求和
Optimize trivial summation in calculation of geometric distribution
def geo_dist_names(p, k):
sum = 0
for i in range(1, 4):
sum += p**i
return (p**(1+k))/sum
p 是一个介于 0 和 1 之间的浮点数,而 k 是一个介于 0 和 3 之间的整数。
该函数基本上只是找到与给定 p 和 k 相关联的几何分布中的值,然后通过除以 4 的总和对其进行归一化k.
的潜在价值
有效,但是我多次调用这个函数所以我想知道是否有更优化的方法来执行这个操作?
您的代码的矢量版本为:
import numpy as np
def geo_dist_names(p, k):
return (p**(1+k))/(p**np.arange(1,4)).sum()
但是,我不确定它是否会比纯 python 更快,因为这里的范围很小,所以 numpy 的开销可能不可忽略。
编辑。确实,假设:
def geo_dist_names_python(p, k, N=4):
sum = 0
for i in range(1, N):
sum += p**i
return (p**(1+k))/sum
def geo_dist_names_numpy(p, k, N=4):
return (p**(1+k))/(p**np.arange(1,N)).sum()
numpy只有在范围增加时才更好:
不知道是不是更优化了。但是作为 one-liner 你可以这样写:
def geo_dist_names(p, k):
return (p**(1+k))/(p+p**2+p**3)
def geo_dist_names(p, k):
sum = 0
for i in range(1, 4):
sum += p**i
return (p**(1+k))/sum
p 是一个介于 0 和 1 之间的浮点数,而 k 是一个介于 0 和 3 之间的整数。 该函数基本上只是找到与给定 p 和 k 相关联的几何分布中的值,然后通过除以 4 的总和对其进行归一化k.
的潜在价值有效,但是我多次调用这个函数所以我想知道是否有更优化的方法来执行这个操作?
您的代码的矢量版本为:
import numpy as np
def geo_dist_names(p, k):
return (p**(1+k))/(p**np.arange(1,4)).sum()
但是,我不确定它是否会比纯 python 更快,因为这里的范围很小,所以 numpy 的开销可能不可忽略。
编辑。确实,假设:
def geo_dist_names_python(p, k, N=4):
sum = 0
for i in range(1, N):
sum += p**i
return (p**(1+k))/sum
def geo_dist_names_numpy(p, k, N=4):
return (p**(1+k))/(p**np.arange(1,N)).sum()
numpy只有在范围增加时才更好:
不知道是不是更优化了。但是作为 one-liner 你可以这样写:
def geo_dist_names(p, k):
return (p**(1+k))/(p+p**2+p**3)