gh-91851: Trivial optimizations in Fraction (#100791)

Make some trivial performance optimizations in Fraction

Uses private class attributes `_numerator` and `_denominator` in place of the `numerator` and `denominator` property accesses.

Co-authored-by: hauntsaninja <hauntsaninja@gmail.com>
This commit is contained in:
Sergey B Kirpichev 2023-01-06 18:37:34 +03:00 committed by GitHub
parent 15c44789bb
commit 0e640260da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 5 deletions

View file

@ -650,12 +650,12 @@ class Fraction(numbers.Rational):
def __floor__(a):
"""math.floor(a)"""
return a.numerator // a.denominator
return a._numerator // a._denominator
def __ceil__(a):
"""math.ceil(a)"""
# The negations cleverly convince floordiv to return the ceiling.
return -(-a.numerator // a.denominator)
return -(-a._numerator // a._denominator)
def __round__(self, ndigits=None):
"""round(self, ndigits)
@ -663,10 +663,11 @@ class Fraction(numbers.Rational):
Rounds half toward even.
"""
if ndigits is None:
floor, remainder = divmod(self.numerator, self.denominator)
if remainder * 2 < self.denominator:
d = self._denominator
floor, remainder = divmod(self._numerator, d)
if remainder * 2 < d:
return floor
elif remainder * 2 > self.denominator:
elif remainder * 2 > d:
return floor + 1
# Deal with the half case:
elif floor % 2 == 0: