Asynchronous Messaging

wink wink at saville.com
Thu Sep 27 00:43:32 EDT 2007


Fredrik,

You are most correct, but Queue is slow compared to deque but
not for the reason I guessed. Apparently it's because deque is
implemented in C while Queue is in python. Using the program below
it looks there is about a 35:1 speed difference.

            100 d.append  0.000011s  0.1097us per
            100 d.popL    0.000011s  0.1097us per
            100 q.put     0.000429s  4.2892us per
            100 q.get     0.000391s  3.9077us per

So someday it _might_ warrant adding Queue to collections.


#!/usr/bin/python

import timeit
import Queue
from collections import deque

setupD = """
from collections import deque
d=deque()
cnt = %d
for x in xrange(cnt):
    d.append(x)
"""

setupQ = """
import Queue
q=Queue.Queue()
cnt = %d
for x in xrange(cnt):
    q.put(x)
"""

def main():
    cnt = 100
    t = timeit.Timer(setup=setupD % cnt, stmt="d.append(0)")
    time = min(t.repeat(10000, cnt))
    print "      %9d d.append  %fs %7.4fus per" % \
            (cnt, time, (time/cnt) * 1000000.0)

    t = timeit.Timer(setup=setupD % cnt, stmt="d.popleft()")
    time = min(t.repeat(10000, cnt))
    print "      %9d d.popL    %fs %7.4fus per" % \
            (cnt, time, (time/cnt) * 1000000.0)

    t = timeit.Timer(setup=setupQ % cnt, stmt="q.put(0)")
    time = min(t.repeat(10000, cnt))
    print "      %9d q.put     %fs %7.4fus per" % \
            (cnt, time, (time/cnt) * 1000000.0)

    t = timeit.Timer(setup=setupQ % cnt, stmt="q.get()")
    time = min(t.repeat(10000, cnt))
    print "      %9d q.get     %fs %7.4fus per" % \
            (cnt, time, (time/cnt) * 1000000.0)
if __name__ == "__main__":
    main()




More information about the Python-list mailing list