numpy 二项式随机数效率低吗?

2024-01-18

我一直在从不同的分布中采样随机数,并且刚刚意识到 numpy 二项式随机数与其他分布相比有多慢。例如

%timeit for x in range(100): np.random.binomial(100,0.5)
10000 loops, best of 3: 82.6 µs per loop
%timeit for x in range(100): np.random.uniform()
100000 loops, best of 3: 14.6 µs per loop

二项式数比均匀数多 6 倍!这是可以理解的,因为二项式是离散的并且需要更复杂的变换。但例如,如果我要求进行多次试验 n=0 或 n=1 的二项式,则花费的时间类似:

%timeit for x in range(100): np.random.binomial(0,0.5)
10000 loops, best of 3: 78.8 µs per loop

%timeit for x in range(100): np.random.binomial(1,0.5)
10000 loops, best of 3: 80.1 µs per loop

这似乎不是很有效,因为这些采样的结果应该是微不足道的:对于零次试验,结果应该始终为零,对于 1 次试验,它应该是简单的伯努利试验。例如,二项式的更快实现将是:

import numpy as np

def custombinomial(n,p):
    if n == 0:
        return 0
    if n == 1:
        x = np.random.uniform()
        if x<p:
            return 1
        else:
            return 0  
    else:
        return np.random.binomial()

时间安排如下:

%timeit for x in range(100): custombinomial(0,0.5)
100000 loops, best of 3: 11.8 µs per loop

 %timeit for x in range(100): custombinomial(1,0.5)
10000 loops, best of 3: 31.2 µs per loop

我确信对于更大的 n 值,这可以得到改进。我有什么理由错过 numpy 这么慢吗?是否有任何其他库可以提供更快的随机数(即使它包含某种 C/Cython)?

另外,我知道如果我想同时创建一堆随机数,即获取二项式分布数字的数组,那么 numpy 很好,但在许多情况下,分布 n 和 p 的参数会动态变化,因此调用单个随机数不会直接成为一种选择。是否可能有一种替代方案,其中生成均匀分布的随机数数组,并根据需要将它们转换为特定的二项式?


Numpy 的传统二项式随机生成器是用C实现 https://github.com/numpy/numpy/blob/9ee262b5bf89e8c866a507e4d62b78532361adc2/numpy/random/src/legacy/legacy-distributions.c,如果参数足够小,算法将使用数值反演。这可能工作量太大,如果p = 0.5,因为随机位而不是随机doubles 可以在二项式生成器中使用。此外,基本算法似乎多年来都没有改变(另请参阅mtrand.pyx https://github.com/numpy/numpy/blob/master/numpy/random/mtrand/mtrand.pyx),因此它不会利用矢量化或多线程等优势。

此外,在 Numpy 的早期,“没有太多理由改变分布方法”,因此 Numpy 中的这种随机生成算法和其他随机生成算法都以可重现的“随机性”的名义保留下来。然而,这在版本 1.17 及更高版本中发生了变化:现在允许对随机生成方法(例如新的二项式生成器)进行重大更改,但被视为新功能,仅在“X.Y释放,从不X.Y.Z”。详情请参见“RNG政策 https://github.com/numpy/numpy/blob/master/doc/neps/nep-0019-rng-policy.rst" and "随机采样(numpy.random) https://numpy.org/devdocs/reference/random/index.html#parallel-generation".

如果更快的二项式随机变量对您很重要,您应该提交一个新的Numpy 问题 https://github.com/numpy/numpy/issues.

编辑(11 月 9 日):遗留发行版的代码已移动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy 二项式随机数效率低吗? 的相关文章

随机推荐

  • Kubernetes 和 JVM 内存设置

    In a Kubernetes具有众多微服务的集群 其中一个专门用于Java Virtual Machine JVM 运行Java 1 8数据处理应用程序 直到最近 该 JVM Pod 中运行的作业消耗的 RAM 还不到 1 GB 因此该
  • 加速 numpy 3D 数组的卷积循环?

    沿着 3d numpy 数组的 Z 向量执行卷积 然后对结果进行其他操作 但由于现在实现的原因 速度很慢 是 for 循环让我慢下来还是卷积 我尝试重塑为一维向量并在 1 遍中执行卷积 就像我在 Matlab 中所做的那样 而不使用 for
  • Git 远程分支已删除,但仍然出现在“branch -a”中

    假设我有一个名为coolbranch在我的存储库中 现在 我决定使用以下命令删除它 远程和本地 git push origin coolbranch git branch D coolbranch 伟大的 现在分支真的被删除了 但当我跑步时
  • 获取目录所有者信息

    我的脚本以递归方式获取目录信息 例如目录名称 LastAccessTime LastWriteTime 和大小 我想知道是否可以获取文件夹所有者名称 这是我的脚本 function Get DirSize param Parameter M
  • 渲染 razor 模板时自定义 WebViewPage 注入代码

    我正在尝试创建一个自定义 Razor 视图基类 继承WebViewPage 这将为每个正在渲染的视图模板 包括布局和部分视图 注入一些 HTML 以便我在客户端上有每个 Razor 模板开始位置的引用 对它结束的位置不感兴趣 到目前为止我尝
  • 使用惰性数据表时,另一个组件不会更新/第二个组件数据落后于一个请求

    我有一个 PrimeFacesp dataTable并通过实现启用延迟加载LazyDataModel dataTable 保存搜索结果 因此在执行搜索请求时 搜索服务仅检索所需的 分页 数据 效果很好 当使用 ajax 请求时p comma
  • Matter JS - 物理 - 如何定义重元素,难以被小元素移动

    我一直在努力研究 Matter JS 的物理原理 试图让它们正确 我有两个要素 Matter Bodies rectangle 400 400 113 66 frictionAir 1 friction 1 density 0 5 rest
  • SCons - 非标准位置的标头/库

    我正在尝试使用 SCons 编译一个程序 该程序需要一组我已安装在非标准位置的依赖项 我已将依赖项安装在 home dja ocr 中 现在我正在尝试编译主程序 但不知道如何告诉 SCons 在哪里查找库和标头 我已经尝试过 除其他外 sc
  • 使用 python 循环遍历文本文件列表

    编辑 为了更清楚起见 已更新帖子 但还没有答案有帮助 好吧 我的任务是获取一个文本文件 每行有 4 个条目 分别是名字 姓氏 小时数 工资率 我要做一些计算 并将所有这些信息放入 python 的格式化表中 现在 我已经有了将数据输入表中的
  • 语法高亮的正确正则表达式是什么?

    使用 NSRegularExpression 进行语法高亮的正确正则表达式是什么 必须通过以下测试 code comment code comment code code string code code comment code code
  • FlipView 控件在 Windows Phone 8 SDK 中不可用

    FlipView 控件在 Windows Phone 8 SDK 中不可用 实现类似功能的替代方法是什么 这里有几个选项 如果您只想显示固定数量的 页面 您可以使用Panorama http msdn microsoft com en us
  • 赛普拉斯抛出安全错误

    我目前正在使用 Chrome 74 运行 并尝试使用 Cypress 来测试我的应用程序中的样式指南 当我加载 Cypress 时 它会抛出此错误 安全错误 阻止了来源为 http localhost 3000 的框架 访问跨源框架 请告诉
  • 您为网站推荐哪种 PHP CMS? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在建立一个网站 需要使用 CMS 如果我使用已经制作好的 CMS 我需要能够轻松扩展它 您有推荐的特定 CMS 还是我应该自己制作一个 CM
  • Bootstrap:如何更改容器的宽度?

    我使用Twitter Bootstrap开发了一个具有固定容器类的网站 但现在客户希望网站宽度为1000px而不是1170px 我不使用 less 文件 有没有快速的方法来解决这个问题 这是解决方案 media min width 1200
  • 如何在一个文件中定义一个 C 函数,然后从另一个文件中调用它?

    如果我在文件中定义一个函数func1 c 我想从文件中调用它call c 我怎样才能完成这个任务 您可以在文件中放置该函数的声明func1 h 并添加 include func1 h in call c 然后你会编译或链接func1 c a
  • JMS Serializer 忽略 Knp Paginator 的映射

    我在使用 JMS 序列化程序排除某些 KNP Paginator 属性时遇到问题 首先 它包含在composer json中 jms serializer bundle 0 13 knplabs knp paginator bundle 2
  • 从应用程序外部记录按键(VB.net)[重复]

    这个问题在这里已经有答案了 我正在制作一个程序 它使用键盘记录器的功能来确定趋势 问题是我无法制作键盘记录器 我已经完成了大部分内容 但当表单失去焦点时我无法按下按键 我见过有人提到键盘和消息挂钩 但我找不到任何示例或理解任何有关它的文档
  • 如何让 JVM 使用服务器的最大(全部剩余)内存

    我有一个 DFS 算法 java 控制台应用程序 当提供更多内存时 它运行得更快 只是一个 DFS 算法应用程序 既没有 I O 也没有其他外部 JVM 资源使用 它只消耗CPU和内存 该应用程序可以在 1GB 内存下运行 但在 2GB 内
  • ASP.NET Razor 页面下拉列表

    div class form group Html LabelFor model gt model CountyId htmlAttributes new class control label col md 2 div class col
  • numpy 二项式随机数效率低吗?

    我一直在从不同的分布中采样随机数 并且刚刚意识到 numpy 二项式随机数与其他分布相比有多慢 例如 timeit for x in range 100 np random binomial 100 0 5 10000 loops best