推荐学习书目
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 · Jan 31, 2015 · 5757 views
    This topic created in 4152 days ago, the information mentioned may be changed or developed.
    from Queue import Queue


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



    print q.get()
    Supplement 1  ·  Jan 31, 2015
    自己解决了,把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个值随机秒出
    Supplement 2  ·  Jan 31, 2015
    缩进的tab怎么都没了……
    Supplement 3  ·  Jan 31, 2015
    这货有个bug
    self._qsize()

    改成 self._qsize()+1
    22 replies    2015-02-01 16:28:48 +08:00
    yuanji
        1
    yuanji  
       Jan 31, 2015
    import random

    print random.choice(range(10000))

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

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

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

    话说你random get后,queue你不rotate回去么。。
    a2z
        13
    a2z  
    OP
       Jan 31, 2015
    @9hills
    @ruoyu0088

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

    if xxx:
    q.get()
    else:
    q.randget()
    a2z
        14
    a2z  
    OP
       Jan 31, 2015
    @livid

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

    不会,是用optparse指定的,程序运行的时候不会改。
    ryd994
        17
    ryd994  
       Jan 31, 2015 via Android
    deque是用heap实现的
    deque的rotate我记得是log复杂度
    那就问题不大
    ggarlic
        18
    ggarlic  
       Jan 31, 2015
    ryd994
        19
    ryd994  
       Jan 31, 2015 via Android
    @ggarlic 那rotation的效率岂不是线性!
    a2z
        20
    a2z  
    OP
       Feb 1, 2015 via iPhone
    @ryd994
    O(k)

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

    这么一想好像有点慢了
    wuyazi
        21
    wuyazi  
       Feb 1, 2015 via iPhone
    忘记在哪看到一句话了
    “如果一个功能很难实现,一般是你的设计有问题”
    a2z
        22
    a2z  
    OP
       Feb 1, 2015
    @wuyazi
    这是夸我还是黑我……
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5311 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 05:50 · PVG 13:50 · LAX 22:50 · JFK 01:50
    ♥ Do have faith in what you're doing.