append on lists

Chris Rebert clp at rebertia.com
Mon Sep 15 20:08:30 EDT 2008


On Mon, Sep 15, 2008 at 4:03 PM, Steven D'Aprano
<steve at remove-this-cybersource.com.au> wrote:
> On Mon, 15 Sep 2008 13:47:53 -0700, Chris Rebert wrote:
>
>> The code you'd actually want is:
>>
>> d = a[:] #copy a
>> d.append(7)
>>
>> Or if you're willing to overlook the inefficiency:
>>
>> d = a + [7]
>>
>> But that's not idiomatic.
>
> Why is a + [7] more inefficient than manually copying the list and
> appending to the copy? Surely both pieces of code end up doing the same
> thing?
>
> In fact, I'd guess that the second is likely to be marginally more
> efficient than the first:
>
>
>>>> x = compile('d = a[:]; d.append(7)', '', 'exec')
>>>> dis.dis(x)
>  1           0 LOAD_NAME                0 (a)
>              3 SLICE+0
>              4 STORE_NAME               1 (d)
>              7 LOAD_NAME                1 (d)
>             10 LOAD_ATTR                2 (append)
>             13 LOAD_CONST               0 (7)
>             16 CALL_FUNCTION            1
>             19 POP_TOP
>             20 LOAD_CONST               1 (None)
>             23 RETURN_VALUE
>
>>>> x = compile('d = a + [7]', '', 'exec')
>>>> dis.dis(x)
>  1           0 LOAD_NAME                0 (a)
>              3 LOAD_CONST               0 (7)
>              6 BUILD_LIST               1
>              9 BINARY_ADD
>             10 STORE_NAME               1 (d)
>             13 LOAD_CONST               1 (None)
>             16 RETURN_VALUE
>
>
> timeit agrees with me:
>
>>>> from timeit import Timer
>>>> t1 = Timer('d = a[:]; d.append(7)', 'a = []')
>>>> t2 = Timer('d = a + [7]', 'a = []')
>>>> t1.repeat(number=1000)
> [0.0015339851379394531, 0.0014910697937011719, 0.0014841556549072266]
>>>> t2.repeat(number=1000)
> [0.0011889934539794922, 0.0013048648834228516, 0.0013070106506347656]
>
>
> --
> Steven
> --
> http://mail.python.org/mailman/listinfo/python-list
>

Sorry, I was just speculating based on the extraneous list ([7]) used
in the second one.
My bad. :)

Regards,
Chris

-- 
Follow the path of the Iguana...
http://rebertia.com



More information about the Python-list mailing list