2010/1/25 Steve Howell <showel...@yahoo.com>:
>> From: Raymond Hettinger <raymond.hettin...@gmail.com>
>>
>> On Jan 25, 2010, at 12:36 PM, Steve Howell wrote:
>>
>> >
>> > Deque does not support all the operations that list
>> does.  It is also roughly twice as slow for accessing
>> elements (I've measured it).
>>
>>
>> ISTM that apps that want to insert or pop from the front of
>> list are also apps that don't care about accessing arbitrary
>> elements in the middle using the position index.  When
>> lists are growing or shrinking from the front, the meaning
>> of the i-th element changes.   So, it doesn't
>> make sense for an application to track indices of objects in
>> such a list.
>>
>>    i = s.find('abc')
>>    s.pop(0)
>>    print s[i]    # i no longer
>> points at 'abc'
>>
>
> I am not going to directly address your point, but I'd like to give a 
> examples of code that uses pop(0) from the standard library.
>
> If you look at the code for multiprocessing/connection.py, you will see that 
> PipeListener creates _handle_queue as an ordinary Python list, and in line 
> 317 it uses pop(0) to pop the first handle off the top of the queue.
>
> Why does that code not use a deque?  In hindsight, it probably should.  But 
> to make the change now, it's not a simple matter of fixing just PipeListener, 
> because PipeListener passes off _handle_queue to Finalize, which also expects 
> a list.
>
> In order to understand why Finalize expects a list, you need to look at how 
> it uses args, and here is one example usage:
>
> res = self._callback(*self._args, **self._kwargs)
>
> Ok, so now you need to know what self._callback is doing, so now you have to 
> trace through all callers of Finalize are passing in for their args.
>
> So what seems like a trivial matter--switching over a list to a 
> deque--actually requires a lot of thinking.
>
> It turns out that the callback for PipeListener just iterates through the 
> remaining handles and closes them.  So a deque would not break that code.
>
> If you look at difflib.py, it also does pop(0) in a loop.  Why doesn't it use 
> a deque?  Simplicity, maybe?
>
> codecs.py also deletes from the top of the list:
>
> del self.linebuffer[0]

Yes, but in either of these cases is there an excellent performance
improvement to be gained and is it worth the complexity of your
optimization? I think not.


-- 
Regards,
Benjamin
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to