Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 40f9735

Browse files
committed
#22464: Speed up common Fraction operations by special-casing several
operations for int-type arguments: constructor and equality test. Also avoid redundant property lookups in addition and subtraction.
1 parent 02d39c2 commit 40f9735

1 file changed

Lines changed: 17 additions & 7 deletions

File tree

Lib/fractions.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,12 @@ def __new__(cls, numerator=0, denominator=None, _normalize=True):
104104
self = super(Fraction, cls).__new__(cls)
105105

106106
if denominator is None:
107-
if isinstance(numerator, numbers.Rational):
107+
if type(numerator) is int:
108+
self._numerator = numerator
109+
self._denominator = 1
110+
return self
111+
112+
elif isinstance(numerator, numbers.Rational):
108113
self._numerator = numerator.numerator
109114
self._denominator = numerator.denominator
110115
return self
@@ -153,6 +158,9 @@ def __new__(cls, numerator=0, denominator=None, _normalize=True):
153158
raise TypeError("argument should be a string "
154159
"or a Rational instance")
155160

161+
elif type(numerator) is int is type(denominator):
162+
pass # *very* normal case
163+
156164
elif (isinstance(numerator, numbers.Rational) and
157165
isinstance(denominator, numbers.Rational)):
158166
numerator, denominator = (
@@ -399,17 +407,17 @@ def reverse(b, a):
399407

400408
def _add(a, b):
401409
"""a + b"""
402-
return Fraction(a.numerator * b.denominator +
403-
b.numerator * a.denominator,
404-
a.denominator * b.denominator)
410+
da, db = a.denominator, b.denominator
411+
return Fraction(a.numerator * db + b.numerator * da,
412+
da * db)
405413

406414
__add__, __radd__ = _operator_fallbacks(_add, operator.add)
407415

408416
def _sub(a, b):
409417
"""a - b"""
410-
return Fraction(a.numerator * b.denominator -
411-
b.numerator * a.denominator,
412-
a.denominator * b.denominator)
418+
da, db = a.denominator, b.denominator
419+
return Fraction(a.numerator * db - b.numerator * da,
420+
da * db)
413421

414422
__sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
415423

@@ -561,6 +569,8 @@ def __hash__(self):
561569

562570
def __eq__(a, b):
563571
"""a == b"""
572+
if type(b) is int:
573+
return a._numerator == b and a._denominator == 1
564574
if isinstance(b, numbers.Rational):
565575
return (a._numerator == b.numerator and
566576
a._denominator == b.denominator)

0 commit comments

Comments
 (0)