/test3/gmpy_test_thr.py

http://gmpy.googlecode.com/ · Python · 126 lines · 99 code · 13 blank · 14 comment · 20 complexity · 0b6aeb6c200875864aefd96aed87ebc9 MD5 · raw file

  1. # partial unit test for gmpy2 threaded mpz functionality
  2. # relies on Tim Peters' "doctest.py" test-driver
  3. import gmpy2 as _g, doctest, sys, operator, gc, queue, threading
  4. from functools import reduce
  5. __test__={}
  6. def _tf(N=2, _K=1234**5678):
  7. """Takes about 100ms on a first-generation Macbook Pro"""
  8. for i in range(N): assert (_g.mpz(1234)**5678)==_K
  9. a=_g.mpz(123)
  10. b=_g.mpz(456)
  11. c=_g.mpz(123456789123456789)
  12. def factorize(x=c):
  13. r'''
  14. (Takes about 25ms, on c, on a first-generation Macbook Pro)
  15. >>> factorize(a)
  16. [3, 41]
  17. >>> factorize(b)
  18. [2, 2, 2, 3, 19]
  19. >>>
  20. '''
  21. import gmpy2 as _g
  22. savex=x
  23. prime=2
  24. x=_g.mpz(x)
  25. factors=[]
  26. while x>=prime:
  27. newx,mult=x.remove(prime)
  28. if mult:
  29. factors.extend([int(prime)]*mult)
  30. x=newx
  31. prime=_g.next_prime(prime)
  32. for factor in factors: assert _g.is_prime(factor)
  33. from operator import mul
  34. assert reduce(mul, factors)==savex
  35. return factors
  36. def elemop(N=1000):
  37. r'''
  38. (Takes about 40ms on a first-generation Macbook Pro)
  39. '''
  40. for i in range(N):
  41. assert a+b == 579
  42. assert a-b == -333
  43. assert b*a == a*b == 56088
  44. assert b%a == 87
  45. assert divmod(a, b) == (0, 123)
  46. assert divmod(b, a) == (3, 87)
  47. assert -a == -123
  48. assert pow(a, 10) == 792594609605189126649
  49. assert pow(a, 7, b) == 99
  50. assert cmp(a, b) == -1
  51. assert '7' in str(c)
  52. assert '0' not in str(c)
  53. assert a.sqrt() == 11
  54. assert _g.lcm(a, b) == 18696
  55. assert _g.fac(7) == 5040
  56. assert _g.fib(17) == 1597
  57. assert _g.divm(b, a, 20) == 12
  58. assert _g.divm(4, 8, 20) == 3
  59. assert _g.divm(4, 8, 20) == 3
  60. assert _g.mpz(20) == 20
  61. assert _g.mpz(8) == 8
  62. assert _g.mpz(4) == 4
  63. assert a.invert(100) == 87
  64. def _test(chat=None):
  65. if chat:
  66. print("Unit tests for gmpy2 (threading)")
  67. print(" on Python %s" % sys.version)
  68. print("Testing gmpy2 {0}".format(_g.version()))
  69. print(" Mutliple-precision library: {0}".format(_g.mp_version()))
  70. print(" Floating-point library: {0}".format(_g.mpfr_version()))
  71. print(" Complex library: {0}".format(_g.mpc_version()))
  72. print(" Caching Values: (Number) {0}".format(_g.get_cache()[0]))
  73. print(" Caching Values: (Size, limbs) {0}".format(_g.get_cache()[1]))
  74. thismod = sys.modules.get(__name__)
  75. doctest.testmod(thismod, report=0)
  76. if chat: print("Repeating tests, with caching disabled")
  77. _g.set_cache(0,128)
  78. sav = sys.stdout
  79. class _Dummy:
  80. def write(self,*whatever):
  81. pass
  82. try:
  83. sys.stdout = _Dummy()
  84. doctest.testmod(thismod, report=0)
  85. finally:
  86. sys.stdout = sav
  87. if chat:
  88. print()
  89. print("Overall results for thr:")
  90. return doctest.master.summarize(chat)
  91. class DoOne(threading.Thread):
  92. def __init__(self, q):
  93. threading.Thread.__init__(self)
  94. self.q = q
  95. def run(self):
  96. while True:
  97. task = self.q.get()
  98. if task is None: break
  99. task()
  100. def _test_thr(Ntasks=5, Nthreads=1):
  101. q = queue.Queue()
  102. funcs = (_tf, 1), (factorize, 4), (elemop, 2)
  103. for i in range(Ntasks):
  104. for f, n in funcs:
  105. for x in range(n):
  106. q.put(f)
  107. for i in range(Nthreads):
  108. q.put(None)
  109. thrs = [DoOne(q) for i in range(Nthreads)]
  110. for t in thrs: t.start()
  111. for t in thrs: t.join()
  112. if __name__=='__main__':
  113. _test(1)