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: https://mail.python.org/pipermail/python-dev/2009-August/091125.html
and publishes some times: https://mail.python.org/pipermail/python-dev/2009-September/091581.html
(notice that Python was SIX HUNDRED times slower than wget or IE)
and Simon Cross identified the problem: https://mail.python.org/pipermail/python-dev/2009-September/091582.html
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.