[Python-Dev] [Python-checkins] cpython: Issue #19209: Remove import of copyreg from the os module to speed up

Nick Coghlan ncoghlan at gmail.com
Sat Oct 12 01:32:50 CEST 2013


On 12 Oct 2013 09:27, "christian.heimes" <python-checkins at python.org> wrote:
>
> http://hg.python.org/cpython/rev/29c4a6a11e76
> changeset:   86216:29c4a6a11e76
> user:        Christian Heimes <christian at cheimes.de>
> date:        Sat Oct 12 01:27:08 2013 +0200
> summary:
>   Issue #19209: Remove import of copyreg from the os module to speed up
> interpreter startup. stat_result and statvfs_result are now hard-coded to
> reside in the os module.
> The patch is based on Victor Stinner's patch.
>
> files:
>   Lib/os.py             |  27 ---------------------------
>   Lib/test/test_os.py   |  22 ++++++++++++++++++++++
>   Lib/test/test_site.py |   5 ++++-
>   Misc/NEWS             |   4 ++++
>   Modules/posixmodule.c |   4 ++--
>   5 files changed, 32 insertions(+), 30 deletions(-)
>
>
> diff --git a/Lib/os.py b/Lib/os.py
> --- a/Lib/os.py
> +++ b/Lib/os.py
> @@ -945,33 +945,6 @@
>      __all__.extend(["spawnlp", "spawnlpe"])
>
>
> -import copyreg as _copyreg
> -
> -def _make_stat_result(tup, dict):
> -    return stat_result(tup, dict)
> -
> -def _pickle_stat_result(sr):
> -    (type, args) = sr.__reduce__()
> -    return (_make_stat_result, args)
> -
> -try:
> -    _copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
> -except NameError: # stat_result may not exist
> -    pass
> -
> -def _make_statvfs_result(tup, dict):
> -    return statvfs_result(tup, dict)
> -
> -def _pickle_statvfs_result(sr):
> -    (type, args) = sr.__reduce__()
> -    return (_make_statvfs_result, args)
> -
> -try:
> -    _copyreg.pickle(statvfs_result, _pickle_statvfs_result,
> -                     _make_statvfs_result)
> -except NameError: # statvfs_result may not exist
> -    pass
> -
>  # Supply os.popen()
>  def popen(cmd, mode="r", buffering=-1):
>      if not isinstance(cmd, str):
> diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
> --- a/Lib/test/test_os.py
> +++ b/Lib/test/test_os.py
> @@ -26,6 +26,7 @@
>  import codecs
>  import decimal
>  import fractions
> +import pickle
>  try:
>      import threading
>  except ImportError:
> @@ -264,6 +265,13 @@
>              warnings.simplefilter("ignore", DeprecationWarning)
>              self.check_stat_attributes(fname)
>
> +    def test_stat_result_pickle(self):
> +        result = os.stat(self.fname)
> +        p = pickle.dumps(result)
> +        self.assertIn(b'\x03cos\nstat_result\n', p)
> +        unpickled = pickle.loads(p)
> +        self.assertEqual(result, unpickled)
> +
>      def test_statvfs_attributes(self):
>          if not hasattr(os, "statvfs"):
>              return
> @@ -310,6 +318,20 @@
>          except TypeError:
>              pass
>
> +    @unittest.skipUnless(hasattr(os, 'statvfs'),
> +                         "need os.statvfs()")
> +    def test_statvfs_result_pickle(self):
> +        try:
> +            result = os.statvfs(self.fname)
> +        except OSError as e:
> +            # On AtheOS, glibc always returns ENOSYS
> +            if e.errno == errno.ENOSYS:
> +                return
> +        p = pickle.dumps(result)
> +        self.assertIn(b'\x03cos\nstatvfs_result\n', p)
> +        unpickled = pickle.loads(p)
> +        self.assertEqual(result, unpickled)
> +
>      def test_utime_dir(self):
>          delta = 1000000
>          st = os.stat(support.TESTFN)
> diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
> --- a/Lib/test/test_site.py
> +++ b/Lib/test/test_site.py
> @@ -431,10 +431,13 @@
>          modules = eval(stdout.decode('utf-8'))
>          self.assertIn('site', modules)
>
> +        # http://bugs.python.org/issue19205
>          re_mods = {'re', '_sre', 'sre_compile', 'sre_constants',
'sre_parse'}
>          self.assertFalse(modules.intersection(re_mods))
> -
> +        # http://bugs.python.org/issue9548
>          self.assertNotIn('locale', modules)

This looks like it snuck in from a separate patch.

Cheers,
Nick.

> +        # http://bugs.python.org/issue19209
> +        self.assertNotIn('copyreg', modules)
>
>
>  if __name__ == "__main__":
> diff --git a/Misc/NEWS b/Misc/NEWS
> --- a/Misc/NEWS
> +++ b/Misc/NEWS
> @@ -36,6 +36,10 @@
>  Library
>  -------
>
> +- Issue #19209: Remove import of copyreg from the os module to speed up
> +  interpreter startup. stat_result and statvfs_result are now hard-coded
to
> +  reside in the os module.
> +
>  - Issue #19205: Don't import the 're' module in site and sysconfig
module to
>    to speed up interpreter start.
>
> diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
> --- a/Modules/posixmodule.c
> +++ b/Modules/posixmodule.c
> @@ -11974,7 +11974,7 @@
>              return NULL;
>  #endif
>
> -        stat_result_desc.name = MODNAME ".stat_result";
> +        stat_result_desc.name = "os.stat_result"; /* see issue #19209 */
>          stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
>          stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
>          stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
> @@ -11983,7 +11983,7 @@
>          structseq_new = StatResultType.tp_new;
>          StatResultType.tp_new = statresult_new;
>
> -        statvfs_result_desc.name = MODNAME ".statvfs_result";
> +        statvfs_result_desc.name = "os.statvfs_result"; /* see issue
#19209 */
>          if (PyStructSequence_InitType2(&StatVFSResultType,
>                                         &statvfs_result_desc) < 0)
>              return NULL;
>
> --
> Repository URL: http://hg.python.org/cpython
>
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> https://mail.python.org/mailman/listinfo/python-checkins
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20131012/22ce0ce1/attachment.html>


More information about the Python-Dev mailing list