Deepcopying a byte string is quicker than copying it - problem?
Florian Leitner
florian.leitner at gmail.com
Thu Feb 27 05:36:24 EST 2014
On 27.02.14, 7:30 , Frank Millman wrote:
> Hi all
>
> I noticed this a little while ago, but dismissed it as a curiosity.
> On reflection, I decided to mention it here in case it indicates a
> problem.
>
> This is with python 3.3.2.
>
> C:\>python -m timeit -s "import copy" "copy.copy('a'*1000)" 100000
> loops, best of 3: 6.91 usec per loop
>
> C:\>python -m timeit -s "import copy" "copy.deepcopy('a'*1000)"
> 100000 loops, best of 3: 11.8 usec per loop
>
> C:\>python -m timeit -s "import copy" "copy.copy(b'a'*1000)" 10000
> loops, best of 3: 79.9 usec per loop
>
> C:\>python -m timeit -s "import copy" "copy.deepcopy(b'a'*1000)"
> 100000 loops, best of 3: 11.7 usec per loop
>
> As you can see, deepcopying a string is slightly slower than
> copying it.
>
> However, deepcopying a byte string is orders of magnitude quicker
> than copying it.
>
> Actually, looking closer, it is the 'copy' that is slow, not the
'deepcopy'
> that is quick..
>
> Expected, or odd?
>
> Frank Millman
>
>
>
Indeed, just tried this:
Python 3.3.2 (default, Sep 30 2013, 21:37:29)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.75)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import copy
>>>
>>> bs = b'a'*1000 id(bs)
140246553640960
>>> id(copy.copy(bs)) # WATCH THIS!
140246578636800
>>> id(copy.deepcopy(bs))
140246553640960
>>> id(bs[:])
140246553640960
>>>
>>> us = 'a'*1000 id(us)
140246553642496
>>> id(copy.copy(us))
140246553642496
>>> id(copy.deepcopy(us))
140246553642496
>>> id(us[:])
140246553642496
Interesting; copy.copy(b'bytes') creates a "real" copy of an otherwise
immutable value... That might actually be some form of a bug.
By the way, if you are looking into this as something about speed, you
should use slices, not copy.copy/deepcopy, anyways (copy = bc[:]);
More than 5x faster:
$ python -m timeit -s "import copy; s='a'*1000" "copy.copy(s)"
1000000 loops, best of 3: 0.465 usec per loop
$ python -m timeit -s "import copy; s='a'*1000" "cs = s[:]"
10000000 loops, best of 3: 0.0728 usec per loop
--- news://freenews.netfront.net/ - complaints: news at netfront.net ---
More information about the Python-list
mailing list