[Python-Dev] sum(...) limitation
stefan_ml at behnel.de
Mon Aug 4 21:14:49 CEST 2014
Steven D'Aprano schrieb am 04.08.2014 um 20:10:
> On Mon, Aug 04, 2014 at 09:25:12AM -0700, Chris Barker wrote:
>> Good point -- I was trying to make the point about .join() vs + for strings
>> in an intro python class last year, and made the mistake of having the
>> students test the performance.
>> You need to concatenate a LOT of strings to see any difference at all -- I
>> know that O() of algorithms is unavoidable, but between efficient python
>> optimizations and a an apparently good memory allocator, it's really a
>> practical non-issue.
> If only that were the case, but it isn't. Here's a cautionary tale for
> how using string concatenation can blow up in your face:
> Chris Withers asks for help debugging HTTP slowness:
> and publishes some times:
> (notice that Python was SIX HUNDRED times slower than wget or IE)
> and Simon Cross identified the problem:
> leading Guido to describe the offending code as an embarrassment.
Thanks for digging up that story.
>> Blocking sum( some_strings) because it _might_ have poor performance seems
>> awfully pedantic.
> The rationale for explicitly prohibiting strings while merely implicitly
> discouraging other non-numeric types is that beginners, who are least
> likely to understand why their code occasionally and unpredictably
> becomes catastrophically slow, are far more likely to sum strings than
> sum tuples or lists.
Well, the obvious difference between strings and lists (not tuples) is that
strings are immutable, so it would seem more obvious at first sight to
concatenate strings than to do the same thing with lists, which can easily
be extended (they are clearly designed for that). This rational may not
apply as much to beginners as to more experienced programmers, but it
should still explain why this is so often discussed in the context of
string concatenation and pretty much never for lists.
As for tuples, their most common use case is to represent a fixed length
sequence of semantically different values. That renders their concatenation
a sufficiently uncommon use case to make no-one ask loudly for "large
scale" sum(tuples) support.
Basically, extending lists is an obvious thing, but getting multiple
strings joined without using "+"-concatenating them isn't.
More information about the Python-Dev