V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
a2z
V2EX  ›  Python

Python 里如何随机从队列里取一个对象?

  •  
  •   a2z · 2015-01-31 18:39:16 +08:00 · 4973 次点击
    这是一个创建于 3579 天前的主题,其中的信息可能已经有所发展或是发生改变。
    from Queue import Queue


    q=Queue()
    for i in xrange(10000):
    q.put(i)



    print q.get()
    第 1 条附言  ·  2015-01-31 19:28:16 +08:00
    自己解决了,把Queue extend了一下:

    from Queue import Queue


    class Queue(Queue):
    def randget(self):
    from random import randrange
    self.queue.rotate(randrange(0,self._qsize()))
    return self.get()


    q=Queue()
    for i in xrange(1000000):
    q.put(i)


    for i in xrange(10):
    print q.randget()



    性能貌似不错,100w个值随机秒出
    第 2 条附言  ·  2015-01-31 19:29:16 +08:00
    缩进的tab怎么都没了……
    第 3 条附言  ·  2015-01-31 21:50:33 +08:00
    这货有个bug
    self._qsize()

    改成 self._qsize()+1
    22 条回复    2015-02-01 16:28:48 +08:00
    jyjmrlk
        1
    jyjmrlk  
       2015-01-31 18:46:35 +08:00
    import random

    print random.choice(range(10000))

    不知道这个符不符合你的要求。
    icedx
        2
    icedx  
       2015-01-31 18:47:19 +08:00
    import random
    a=random.randrange(0,8)
    a2z
        3
    a2z  
    OP
       2015-01-31 18:50:54 +08:00
    不是取随机数是从queue里面随机get一个对象
    aaaa007cn
        4
    aaaa007cn  
       2015-01-31 19:09:03 +08:00
    做不到
    queue 只能顺序存取
    https://docs.python.org/2/library/queue.html
    FIFO queue
    LIFO queue
    priority queue
    a2z
        5
    a2z  
    OP
       2015-01-31 19:28:50 +08:00
    @aaaa007cn

    搞定了= =
    似乎还行,感觉有点hacky
    aec4d
        6
    aec4d  
       2015-01-31 19:45:07 +08:00
    @a2z 直接重写_get方法比较好看
    kofj
        7
    kofj  
       2015-01-31 20:36:38 +08:00 via iPhone
    不会Python,疑惑的是,既然需要做随机读取,那楼主为什么非要把数据存入线性表而非set呢?
    a2z
        8
    a2z  
    OP
       2015-01-31 21:15:50 +08:00
    @kofj

    因为有时候要随机读取有时候要顺序读取。在python里面queue是deque,读取写入都很快,set的话数据量一大就极慢
    ruoyu0088
        9
    ruoyu0088  
       2015-01-31 21:20:48 +08:00
    “因为有时候要随机读取有时候要顺序读取”,你rotate之后还要不要顺序读取?
    ggarlic
        10
    ggarlic  
       2015-01-31 21:21:34 +08:00
    @a2z 如果要照你这个回复的话,你上面的代码可能有点问题。你rotate之后顺序都变了
    ruoyu0088
        11
    ruoyu0088  
       2015-01-31 21:23:36 +08:00
    9hills
        12
    9hills  
       2015-01-31 21:31:02 +08:00
    看了附言,lz真是思路广

    话说你random get后,queue你不rotate回去么。。
    a2z
        13
    a2z  
    OP
       2015-01-31 21:50:01 +08:00
    @9hills
    @ruoyu0088

    不是随机读之后再顺序读,是类似一个选项

    if xxx:
    q.get()
    else:
    q.randget()
    a2z
        14
    a2z  
    OP
       2015-01-31 21:51:36 +08:00
    @livid

    麻烦解决下空格和tab的缩进问题……
    now i hate python
    ruoyu0088
        15
    ruoyu0088  
       2015-01-31 21:52:38 +08:00
    @a2z 那下次xxx条件不会变?就是说某一次xxx为True->q.get(), 某一次xxx为False->q.randget()?
    a2z
        16
    a2z  
    OP
       2015-01-31 21:54:39 +08:00
    @ruoyu0088

    不会,是用optparse指定的,程序运行的时候不会改。
    ryd994
        17
    ryd994  
       2015-01-31 22:25:41 +08:00 via Android
    deque是用heap实现的
    deque的rotate我记得是log复杂度
    那就问题不大
    ggarlic
        18
    ggarlic  
       2015-01-31 23:06:39 +08:00
    ryd994
        19
    ryd994  
       2015-01-31 23:11:10 +08:00 via Android
    @ggarlic 那rotation的效率岂不是线性!
    a2z
        20
    a2z  
    OP
       2015-02-01 10:33:18 +08:00 via iPhone
    @ryd994
    O(k)

    K是rotate的个数,随机的0-n

    这么一想好像有点慢了
    wuyazi
        21
    wuyazi  
       2015-02-01 12:21:11 +08:00 via iPhone
    忘记在哪看到一句话了
    “如果一个功能很难实现,一般是你的设计有问题”
    a2z
        22
    a2z  
    OP
       2015-02-01 16:28:48 +08:00
    @wuyazi
    这是夸我还是黑我……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:31 · PVG 16:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.