Re: [Python-Dev] [Python-checkins] cpython: Issue #19209: Remove import of copyreg from the os module to speed up
On 12 Oct 2013 09:27, "christian.heimes"
http://hg.python.org/cpython/rev/29c4a6a11e76 changeset: 86216:29c4a6a11e76 user: Christian Heimes
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@python.org https://mail.python.org/mailman/listinfo/python-checkins
Am 12.10.2013 01:32, schrieb Nick Coghlan:
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.
No harm done. It seems like a good idea to document the reason for the test cases so I added links the links at the same time.
participants (2)
-
Christian Heimes
-
Nick Coghlan