New submission from Josh Rosenberg:
copy.copy uses a relatively high overhead approach to copying list, set and
dict, using:
def _copy_with_constructor(x):
return type(x)(x)
This is despite the fact that all three types implement a .copy() method, and
there is already a defined method:
def _copy_with_copy_method(x):
return x.copy()
that (in %timeit tests) runs with substantially less overhead, in percentage
terms; for empty lists, sets and dicts, calling _copy_with_constructor or
_copy_with_copy_method directly on them, the times on my machine (Python 3.5.0,
Linux x86-64) are:
empty list: 281 ns (constructor), 137 ns (method)
empty set: 275 ns (constructor), 175 ns (method)
empty dict: 372 ns (constructor), 211 ns (method)
The method costs could be trimmed further if _copy_with_copy_method was changed
from a Python implementation to using operator.methodcaller, e.g.
try:
# If we have _operator, avoids cost of importing Python code; it's part
of core modules in CPython, already loaded for free
from _operator import methodcaller
except ImportError:
from operator import methodcaller
_copy_with_copy_method = methodcaller('copy')
This doesn't save a whole lot more (shaves another 9-17 ns off the times for
the Python version of _copy_with_copy_method), but it's nice in that it avoids
reinventing the wheel in the copy module. Combining the two changes (to use
methodcaller for _copy_with_copy_method and to have list, set and dict use
_copy_with_copy_method) means we can get rid of both Python defined functions
in favor of a single use of operator.methodcaller used by all types that
previously used either of them.
Obviously not a high priority fix, but I noticed this while trying to figure
out a way to fix zlib's lack of support in the copy module ( #26166 which
apparently duplicates #25007 ) and how to work around it.
----------
components: Library (Lib)
messages: 258704
nosy: josh.r
priority: normal
severity: normal
status: open
title: Improve copy.copy speed for built-in types
type: performance
versions: Python 3.5, Python 3.6
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue26167>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com