mirror of https://github.com/python/cpython
57 lines
1.2 KiB
Python
57 lines
1.2 KiB
Python
#!/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()
|