• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2#
3# Determine threshold for switching from longobject.c divmod to
4# _pylong.int_divmod().
5
6from random import randrange
7from time import perf_counter as now
8from _pylong import int_divmod as divmod_fast
9
10BITS_PER_DIGIT = 30
11
12
13def rand_digits(n):
14    top = 1 << (n * BITS_PER_DIGIT)
15    return randrange(top >> 1, top)
16
17
18def probe_den(nd):
19    den = rand_digits(nd)
20    count = 0
21    for nn in range(nd, nd + 3000):
22        num = rand_digits(nn)
23        t0 = now()
24        e1, e2 = divmod(num, den)
25        t1 = now()
26        f1, f2 = divmod_fast(num, den)
27        t2 = now()
28        s1 = t1 - t0
29        s2 = t2 - t1
30        assert e1 == f1
31        assert e2 == f2
32        if s2 < s1:
33            count += 1
34            if count >= 3:
35                print(
36                    "for",
37                    nd,
38                    "denom digits,",
39                    nn - nd,
40                    "extra num digits is enough",
41                )
42                break
43        else:
44            count = 0
45    else:
46        print("for", nd, "denom digits, no num seems big enough")
47
48
49def main():
50    for nd in range(30):
51        nd = (nd + 1) * 100
52        probe_den(nd)
53
54
55if __name__ == '__main__':
56    main()
57