[Python-Dev] PEP czar for PEP 3144?

Steven D'Aprano steve at pearwood.info
Tue Mar 20 03:51:37 CET 2012


On Mon, Mar 19, 2012 at 02:50:22PM -0700, Ethan Furman wrote:
> Guido van Rossum wrote:
[...]
> >And remember that consistency is good in moderation, but if it becomes
> >a goal in itself you may have a problem.
>> While I agree that consistency as a goal in and of itself is not good, I 
> consider it more important than 'moderation' implies; in my own code I 
> try to only be inconsistent when there is a good reason to be.

I think we're probably in violent agreement, but I would put it this 
way:
Consistency for its own sake *is* good, since consistency makes it 
easier for people to reason about the behaviour of functions on the 
basis that they are similar to other functions. But it is not the *only* 
good, and it is legitimate to trade-off one good for another good as 
needed.
> To me, "it's already a list" isn't a good reason -- yes, that's easier 
> for the library author, but is it easier for the library user? What is 
> the library user gaining by having a list returned instead of an iterator?

I guess this discussion really hinges on which of these two positions 
you take:
1. The function naturally returns a list, should we compromise that 
 simplicity by returning an iterator to be consistent with the other 
 related/similar functions in the library?
2. These related/similar functions naturally return iterators, should we 
 compromise that consistency by allowing one of them to return a list 
 as it simplifies the implementation?
> Of course, the flip-side also holds: what is the library user losing by 
> getting an iterator when a list was available?
>> When we way the pros and cons, and it comes down to a smidgeon of 
> performance in trade for consistency [1], I would vote for consistency.

I lean that way as well.
 
> ~Ethan~
>> [1] I'm assuming that 'iter(some_list)' is a quick operation.

For very small lists, it's about half as expensive as creating the list 
in the first place:
steve at runes:~$ python3.2 -m timeit -s "x = (1,2,3)" "list(x)"
1000000 loops, best of 3: 0.396 usec per loop
steve at runes:~$ python3.2 -m timeit -s "x = (1,2,3)" "iter(list(x))"
1000000 loops, best of 3: 0.614 usec per loop
For large lists, it's approximately free:
steve at runes:~$ python3.2 -m timeit -s "x = (1,2,3)*10000" "list(x)"
10000 loops, best of 3: 111 usec per loop
steve at runes:~$ python3.2 -m timeit -s "x = (1,2,3)*10000" "iter(list(x))"
10000 loops, best of 3: 111 usec per loop
On the other hand, turning the list iterator into a list again is 
probably not quite so cheap.
-- 
Steven


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /