mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			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() |