优化几何分布计算中的琐碎求和

发布于 2025-01-11 06:34:24 字数 330 浏览 0 评论 0原文

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 之间的整数。 该函数基本上只是找到与给定 pk 相关的几何分布中的值,然后通过除以 的 4 个潜在值的总和来对其进行归一化k。

它有效,但我多次调用这个函数,所以我想知道是否有更优化的方法来执行此操作?

def geo_dist_names(p, k):
    sum = 0
    for i in range(1, 4):
        sum += p**i   
    return (p**(1+k))/sum

p is a float between 0 and 1 and k is an int between 0 and 3.
The function basically just find the value in a geometric distribution associated with the given p and k and then normalizes this by dividing with the sum of the 4 potential values for k.

It works, but I am calling this function many times so I wondered if there were a more optimized way of performing this operation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

俯瞰星空 2025-01-18 06:34:24

你的代码的矢量版本是:

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 仅在范围增加时更好:

在此处输入图像描述

The vectorial version of your code would be:

import numpy as np

def geo_dist_names(p, k):
    return (p**(1+k))/(p**np.arange(1,4)).sum()

Yet, I'm not sure that it will be faster than pure python as the range is quite small here, so the overhead of numpy is probably not negligible.

Edit. Indeed, assuming:

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 is better only when the range increases:

enter image description here

提笔书几行 2025-01-18 06:34:24

不知道有没有更优化。但作为一句单行话,你可以这样写:

def geo_dist_names(p, k):
    return (p**(1+k))/(p+p**2+p**3)

Don't know if it's more optimized. But as a one-liner you can wright it like this:

def geo_dist_names(p, k):
    return (p**(1+k))/(p+p**2+p**3)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文