| #!/usr/bin/env python3 |
| # |
| # Determine threshold for switching from longobject.c divmod to |
| # _pylong.int_divmod(). |
| |
| from random import randrange |
| from time import perf_counter as now |
| from _pylong import int_divmod as divmod_fast |
| |
| BITS_PER_DIGIT = 30 |
| |
| |
| def rand_digits(n): |
| top = 1 << (n * BITS_PER_DIGIT) |
| return randrange(top >> 1, top) |
| |
| |
| def probe_den(nd): |
| den = rand_digits(nd) |
| count = 0 |
| for nn in range(nd, nd + 3000): |
| num = rand_digits(nn) |
| t0 = now() |
| e1, e2 = divmod(num, den) |
| t1 = now() |
| f1, f2 = divmod_fast(num, den) |
| t2 = now() |
| s1 = t1 - t0 |
| s2 = t2 - t1 |
| assert e1 == f1 |
| assert e2 == f2 |
| if s2 < s1: |
| count += 1 |
| if count >= 3: |
| print( |
| "for", |
| nd, |
| "denom digits,", |
| nn - nd, |
| "extra num digits is enough", |
| ) |
| break |
| else: |
| count = 0 |
| else: |
| print("for", nd, "denom digits, no num seems big enough") |
| |
| |
| def main(): |
| for nd in range(30): |
| nd = (nd + 1) * 100 |
| probe_den(nd) |
| |
| |
| if __name__ == '__main__': |
| main() |