numpy.random.choice 的性能

2024-04-09

我更新了代码和时间。

我正在尝试提高代码中函数的性能。我必须生成一个包含随机元素的列表。但是,列表的不同部分必须填充来自不同集合的元素。代码示例如下。我必须生成数百万个这样的列表,一次一个。

函数 foo1 是最快的,但它不能满足我的需要。它可供性能参考。函数 foo2 和 foo3 可以满足我的需要,但花费的处理时间几乎是 foo1 的三倍。

Python 2.7.9(默认,2015 年 2 月 10 日,03:29:19)。达尔文上的 [GCC 4.2.1 兼容 Apple LLVM 6.0 (clang-600.0.56)]。麻木的。version '1.8.1'

import numpy

import timeit

_ops_1 = ["-123.456", "3.1416", "1", "2"]
_ops_2 = ["ABC", "XYZ", 'A', 'B', 'C']

size = 10

def foo1 (): 
    return numpy.random.choice(_ops_1 + _ops_2, 5*size)

def foo2 (): 
    return list(numpy.concatenate((numpy.random.choice(_ops_1, 2*size), 
        numpy.random.choice(_ops_1 + _ops_2, size),
        numpy.random.choice(_ops_2, 2*size)), 0))

def foo3 (): 
    return numpy.random.choice(_ops_1, 2*size).tolist() + \
        numpy.random.choice(_ops_1 + _ops_2, size).tolist() + \
        numpy.random.choice(_ops_2, 2*size).tolist()

### Suggested by Divakar
def random_choice_replace_True(arr,size):
    return numpy.take(arr,numpy.random.randint(0,len(arr),size))

def foo4 (): 
    return random_choice_replace_True(_ops_1, 2*size).tolist() + \
        random_choice_replace_True(_ops_1 + _ops_2, size).tolist() + \
        random_choice_replace_True(_ops_2, 2*size).tolist()

### 2nd suggestion by Divakar
def random_choice_replace_True_idx(arr,size):
    return numpy.array(arr)[numpy.random.randint(0,len(arr),size)]

def foo5 (): 
    return random_choice_replace_True_idx(_ops_1, 2*size).tolist() + \
        random_choice_replace_True_idx(_ops_1 + _ops_2, size).tolist() + \
        random_choice_replace_True_idx(_ops_2, 2*size).tolist()

###########

setup = '''import numpy

_ops_1 = ["-123.456", "3.1416", "1", "2"]
_ops_2 = ["ABC", "XYZ", 'A', 'B', 'C']

size = 10'''

# As required, Number was increased to 10 million to get closer to actual timings
timeit.timeit(foo1, setup=setup, number=10000000)

timeit.timeit(foo2, setup=setup, number=10000000)

timeit.timeit(foo3, setup=setup, number=10000000)

timeit.timeit(foo4, setup=setup, number=10000000)

timeit.timeit(foo5, setup=setup, number=10000000)

我的机器上的运行时间是:

timeit.timeit(foo1, setup=setup, number=10000000) 235.22050380706787

timeit.timeit(foo2, setup=setup, number=10000000) 760.1884841918945

timeit.timeit(foo3, setup=setup, number=10000000) 560.77258586883545

timeit.timeit(foo4, setup=setup, number=10000000) 388.69550228118896

timeit.timeit(foo5, setup=setup, number=10000000) 252.32089233398438

好吧,现在我接受 Divakar 提出的第二个建议,这个建议非常好。但欢迎其他建议!


That np.random.choice http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.html及其可选参数replace被设置为True返回从输入数组中随机选择的元素,并且这些元素可以重复。我们可以通过创建覆盖数组长度的随机索引并索引到数组中以进行选择来模拟这种行为。因此,我们可以用这样的东西来模拟内置的 -

def random_choice_replace_True(A,size):
    return np.array(A)[np.random.randint(0,len(A),size)]

如果您正在处理已经是 NumPy 数组的输入,则可以跳过np.array(A)部分进行转换并简单使用A there.

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

numpy.random.choice 的性能 的相关文章

  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • HTML 5 游戏是否使用 Canvas 和 Javascript?这种情况下如何防止作弊呢?

    HTML 5 游戏是否使用 Canvas 和 Javascript 这种情况下如何防止作弊呢 例如 如果用户使用 GreaseMonkey 或某些工具来更改脚本 使其每次只向服务器报告完美的游戏分数 该怎么办 我会用我自己的问题来回答你的问
  • 如何使用gdb来探索堆栈/堆?

    谁能给我一个快速概述 给我指出一种检查 C 程序堆栈 和堆 的方法的文档 我认为这应该用 GDB 来完成 但如果有其他更直接的替代方案 那么也应该没问题 Thanks 您可以使用 x 命令转储原始内存 因此 如果您想查看堆栈或堆的位 请尝试
  • gcc 通过 homebrew 没有 --without-multilib 选项

    我想在 Python 3 5 中安装 xgboost 这个需要gcc支持 fopenmp选项 默认gcc不支持 所以我正在使用 brew install gcc without multilib 但我得到Warning gcc this f
  • 将本地文件的内容读取到 Rails 中的变量中

    我想做的就是从本地文件中获取所有内容并将其存储在变量中 如何 File read icon full filename each l r l 只给我一部分 在 PHP 中 我刚刚使用file get contents data File r
  • 硬币兑换 DP 解决方案以跟踪硬币

    尝试为一般的硬币找零问题编写一个 DP 解决方案 该解决方案还可以跟踪使用了哪些硬币 到目前为止 我已经可以为我提供所需的最低数量的硬币 但无法弄清楚如何获取使用了哪些硬币以及使用了多少次 如果使用硬币 我尝试设置另一个带有值的表 布尔值
  • Javascript 域模型对象约定

    如果我必须在 C 中创建域模型对象 我可能会这样做 public class Person Public string Name get set Public string Gender get set Public int Age get
  • 使用文本框自动滚动到底部

    我有一个由 ms access 制作的 mdb 文件 它有一个表单 表单内部有一个大文本框 制作此文本框的目的是通过在文本框中添加消息来显示某些工作的进度 txtStatus value txtStatus value Doing some
  • 如何通过 COM 公开 .netstandard2.0 库以便在 VB6 中使用?

    我有一个 dotnet 核心库 一个框架 4 7 2 库和一个 vb6 应用程序 我想编写一个公共库供他们所有人访问 因此选择 netstandard2 0 我尝试了 netstandard2 0 库和 vb6 之间的 4 7 2 框架包装
  • Grails:两个域对象之间的多重关系

    我正在尝试在 Grails 中的两个域类之间实现两种不同类型的关系 考虑以下 我有两个域类 一个作者类和一个书籍类 其中一个作者拥有很多书籍 class Author String name class Book String title
  • 在 SQL Management studio 中更改 CommandTimeout

    如何更改 SQL Management Studio 中的 CommandTimeout 如果您在使用表设计器时遇到超时 请更改工具 gt 选项 gt 设计器 gt 表和数据库设计器下的 事务超时时间 值 这将消除此消息 超时已到 操作完成
  • pandas 六个月的日期范围

    所以 这是我的数据框 PatientNumber QT Answer Answerdate DiagnosisDate 1 1 transferring No 2017 03 03 2018 05 03 2 1 preparing food
  • epoll_wait()接收socket关闭两次(read()/recv()返回0)

    我们有一个使用 epoll 来侦听和处理 http 连接的应用程序 有时 epoll wait 会连续两次收到 fd 上的 close 事件 含义 epoll wait 返回连接 fd 其中 read recv 返回 0 这是一个问题 因为
  • pg (node-postgres) 是否自动清理数据

    我在用node postgres对于生产应用程序 我想知道是否有什么我应该关心的 数据是否自动清理node postgres 我在 github 页面上找不到任何相关信息 https github com brianc node postg
  • BrokeredMessage Azure ServiceBus 的虚假传递和接收

    我创建了一个 BrokeredMessage 实例 并希望围绕它的传递计数与队列的最大传递计数来测试我的代码 我不想建立一个真正的队列来发送和接收消息 但在消息传递之前 deliverycount 属性不会初始化 我怎样才能伪造这个 我设法
  • Ninject:将某物与其自身绑定是什么意思?

    Ninject 具有以下功能self binding like Bind
  • Rollup 函数 - 替换 NULL

    我的 SQL 的最后部分似乎遇到了麻烦 当在我的 SQL 中使用汇总函数实现分组依据时 会出现 NULL 如何修改 NULL 以便在此聚合 SQL 中将其替换为 TOTAL Current table returned Name Activ
  • 在Python中将数据作为后台进程写入磁盘

    我有一个 Python 程序 基本上执行以下操作 for j in xrange 200 1 Compute a bunch of data 2 Write data to disk 1 大约需要2 5分钟2 大约需要 1分钟 请注意 内存
  • 如何在多线程模式下使用 Gunicorn 运行 Flask

    我有用 Flask 编写的网络应用程序 正如大家所建议的 我不能在生产中使用 Flask 所以我想到了枪与烧瓶 在 Flask 应用程序中 我正在加载一些机器学习模型 它们的总大小为 8GB 我的 Web 应用程序的并发性可以达到1000
  • Laravel 中的菜单逻辑应该放在哪里?

    在 Laravel 中放置菜单数据逻辑的最佳概念位置是什么 如果我使用菜单包放在哪里 在Base Controller创建额外的功能或不同的东西 Note 这个答案是为 Laravel 3 编写的 可能适用于最新的 Laravel 4 也可
  • numpy.random.choice 的性能

    我更新了代码和时间 我正在尝试提高代码中函数的性能 我必须生成一个包含随机元素的列表 但是 列表的不同部分必须填充来自不同集合的元素 代码示例如下 我必须生成数百万个这样的列表 一次一个 函数 foo1 是最快的 但它不能满足我的需要 它可