bpo-44154: optimize Fraction pickling (GH-26186)

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 @@ def __bool__(a):
     # 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 sys
 import unittest
 from copy import copy, deepcopy
+import pickle
 from pickle import dumps, loads
 F = fractions.Fraction
 
@@ -691,7 +692,8 @@ def testApproximateCos1(self):
     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.