[Patches] [ python-Patches-910929 ] Optimize list comprehensions
SourceForge.net
noreply at sourceforge.net
Mon Mar 8 05:58:00 EST 2004
Patches item #910929, was opened at 2004-03-06 13:22
Message generated for change (Comment added) made by arigo
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=910929&group_id=5470
Category: Core (C code)
Group: Python 2.4
Status: Closed
Resolution: Accepted
Priority: 5
Submitted By: Raymond Hettinger (rhettinger)
Assigned to: Nobody/Anonymous (nobody)
Summary: Optimize list comprehensions
Initial Comment:
Save about 35% on the per pass overhead of list
comprehensions.
Adds a new opcode, LIST_APPEND, which is faster than
the current call to CALL_FUNCTION 1 on the bound
method, list.append(), and the subsequent call to
POP_TOP to clear the returned None value.
The resulting disassembled code is suprisingly light
and concise.
----------------------------------------------------------------------
>Comment By: Armin Rigo (arigo)
Date: 2004-03-08 10:58
Message:
Logged In: YES
user_id=4771
The patch also removes the final DELETE_FAST. Why? I think deleting this old reference to the list is a good idea.
Another faster (but slightly less clear) approach would be to change the behavior of LIST_APPEND so that the '_' variable can be completely avoided. In stack manipulation notation:
LIST_APPEND [list, ignored, value] -> [list, ignored]
where 'ignored' is the iterator still on the stack. Admittedly this is quite an unexpected behavior, so maybe LIST_APPEND should be called LIST_COMPREHEND or somesuch.
An intermediate solution with no change in LIST_APPEND would introduce a DUP_OVER stack manipulation opcode:
DUP_OVER [a, b] -> [a, b, a]
which could replace the LOAD_FAST '_' at the beginning of the loop, getting the list object from over the iterator.
----------------------------------------------------------------------
Comment By: Raymond Hettinger (rhettinger)
Date: 2004-03-07 07:41
Message:
Logged In: YES
user_id=80475
Applied to:
Python/ceval.c 2.379
Python/compile.c 2.299
Include/opcode.h 2.44
Lib/opcode.py 1.5
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=910929&group_id=5470
More information about the Patches
mailing list