
noreply at sourceforge
Jun 15, 2001, 10:14 PM
Post #4 of 4
(44 views)
Permalink
|
|
[ python-Bugs-433228 ] repr(list) woes when len(list) big
[In reply to]
|
|
Bugs item #433228, was updated on 2001-06-14 12:37 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=105470&aid=433228&group_id=5470 Category: Python Interpreter Core Group: None >Status: Closed >Resolution: Fixed Priority: 5 Submitted By: Tim Peters (tim_one) >Assigned to: Tim Peters (tim_one) Summary: repr(list) woes when len(list) big Initial Comment: This code fatally confuses Win2K: ints = range(100000) x = map(ints, ints) "ints" isn't a callable object, so call_object does PyObject_Repr on it in order to produce an error msg. In the bowels of list_repr, i gets to 21069 and that's all: string_concat's call to PyObject_MALLOC never returns. size==136374 at this point, so it's not like we're asking for an unreasonable amount of memory, Win2K is just lost. Hitting Ctrl+C does interrupt the program, but it dies immediately then with a memory fault inside MS's runtime libraries. The simpler x = repr(range(100000)) is much the same, except list_repr's i sticks at 15713 then, and hitting Ctrl+C confuses the debugger. On Linux there are no memory faults, but on Fred's laptop the second program snippet showed no sign of completing. Since list_repr uses a quadratic-time algorithm, that much was expected; whether it's reasonable is open to debate. ---------------------------------------------------------------------- >Comment By: Tim Peters (tim_one) Date: 2001-06-15 22:14 Message: Logged In: YES user_id=31435 Closed. I gave Python linear-time repr() implementations for dicts, lists and tuples: Include/stringobject.h; new revision: 2.28 Objects/dictobject.c; new revision: 2.104 Objects/listobject.c,v new revision: 2.96 Objects/stringobject.c; new revision 2.119 Objects/tupleobject.c; new revision: 2.53 ---------------------------------------------------------------------- Comment By: Tim Peters (tim_one) Date: 2001-06-15 17:15 Message: Logged In: YES user_id=31435 WRT #1, I patched call_object() (ceval.c rev 2.247), and now it displays TypeError: object of type 'list' is not callable WRT #2, I'm leaving this report open, because interrupting via Ctrl+C can lead to memory faults on Win2K (see original report), and because the 2.2 Python pprint.pprint(x) is much faster than builtin repr(x) for large x of list, tuple and dict types (on both Windows and Linux). This makes "an excuse" less appealing than it was in 2.1. Making repr() linear-time in these cases is straightforward, but requires a Python-level way to get at string.join. ---------------------------------------------------------------------- Comment By: Guido van Rossum (gvanrossum) Date: 2001-06-15 09:40 Message: Logged In: YES user_id=6380 Seem to be two things: 1) The error message in call_object() uses repr() of an unknown object. THIS IS EVIL. Error messages should NEVER use the repr of an object unless they know for sure that the repr fits in a few hundred bytes. They should show the type of the unknown object instead. 2) Repr of a very long list is inefficient. I can live with that; it falls in the category "then don't do that". it can be interrupted with ^C. ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=105470&aid=433228&group_id=5470
|