]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44154: optimize Fraction pickling (GH-26186)
authorSergey B Kirpichev <2155800+skirpichev@users.noreply.github.com>
Mon, 17 May 2021 07:20:02 +0000 (10:20 +0300)
committerGitHub <noreply@github.com>
Mon, 17 May 2021 07:20:02 +0000 (00:20 -0700)
Lib/fractions.py
Lib/test/test_fractions.py
Misc/NEWS.d/next/Library/2021-05-17-07-24-24.bpo-44154.GRI5bf.rst [new file with mode: 0644]

index 96047beb4546a5384e23e2963f45abe5186dd9cc..64a8959d7d48e564649b24b97ca6680b3e94fcb7 100644 (file)
@@ -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:
index b92552531d6bb214129af35fc4506cc2f469b5b4..949ddd9072862f6d219a6023098484a085b87123 100644 (file)
@@ -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 (file)
index 0000000..3ec326e
--- /dev/null
@@ -0,0 +1 @@
+Optimize :class:`fractions.Fraction` pickling for large components.