summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey B Kirpichev <2155800+skirpichev@users.noreply.github.com>2021-05-17 07:20:02 (GMT)
committerGitHub <noreply@github.com>2021-05-17 07:20:02 (GMT)
commitb102dd598dd2666b72e93ae53ae813d1e88f186c (patch)
tree06d92560ced1302efbd45e4317fc90282aa8905f
parentb3f65e819f552561294a66e350a9f5a3131f7df2 (diff)
downloadcpython-b102dd598dd2666b72e93ae53ae813d1e88f186c.zip
cpython-b102dd598dd2666b72e93ae53ae813d1e88f186c.tar.gz
cpython-b102dd598dd2666b72e93ae53ae813d1e88f186c.tar.bz2
bpo-44154: optimize Fraction pickling (GH-26186)
-rw-r--r--Lib/fractions.py2
-rw-r--r--Lib/test/test_fractions.py4
-rw-r--r--Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst1
3 files changed, 5 insertions, 2 deletions
diff --git a/Lib/fractions.py b/Lib/fractions.py
index 96047be..64a8959 100644
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -735,7 +735,7 @@ class Fraction(numbers.Rational):
# support for pickling, copy, and deepcopy
def __reduce__(self):
- return (self.__class__, (str(self),))
+ return (self.__class__, (self._numerator, self._denominator))
def __copy__(self):
if type(self) == Fraction:
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index b925525..949ddd9 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -10,6 +10,7 @@ import functools
import sys
import unittest
from copy import copy, deepcopy
+import pickle
from pickle import dumps, loads
F = fractions.Fraction
@@ -691,7 +692,8 @@ class FractionTest(unittest.TestCase):
def test_copy_deepcopy_pickle(self):
r = F(13, 7)
dr = DummyFraction(13, 7)
- self.assertEqual(r, loads(dumps(r)))
+ for proto in range(0, pickle.HIGHEST_PROTOCOL + 1):
+ self.assertEqual(r, loads(dumps(r, proto)))
self.assertEqual(id(r), id(copy(r)))
self.assertEqual(id(r), id(deepcopy(r)))
self.assertNotEqual(id(dr), id(copy(dr)))
diff --git a/Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst b/Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst
new file mode 100644
index 0000000..3ec326e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst
@@ -0,0 +1 @@
+Optimize :class:`fractions.Fraction` pickling for large components.