Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Bugs

[ python-Bugs-433228 ] repr(list) woes when len(list) big

 

 

Python bugs RSS feed   Index | Next | Previous | View Threaded


noreply at sourceforge

Jun 14, 2001, 12:37 PM

Post #1 of 4 (44 views)
Permalink
[ python-Bugs-433228 ] repr(list) woes when len(list) big

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: Open
Resolution: None
Priority: 5
Submitted By: Tim Peters (tim_one)
Assigned to: Nobody/Anonymous (nobody)
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.


----------------------------------------------------------------------

You can respond by visiting:
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=433228&group_id=5470


noreply at sourceforge

Jun 15, 2001, 9:40 AM

Post #2 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: Open
Resolution: None
Priority: 5
Submitted By: Tim Peters (tim_one)
Assigned to: Nobody/Anonymous (nobody)
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: 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


noreply at sourceforge

Jun 15, 2001, 5:15 PM

Post #3 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: Open
Resolution: None
Priority: 5
Submitted By: Tim Peters (tim_one)
Assigned to: Nobody/Anonymous (nobody)
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 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


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

Python bugs RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.