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