[Python-checkins] cpython: Issue #19209: Remove import of copyreg from the os module to speed up
christian.heimes
python-checkins at python.org
Sat Oct 12 01:27:41 CEST 2013
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)
+ # 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
More information about the Python-checkins
mailing list