Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import random
  4. import time
  5. from concurrent.futures import ProcessPoolExecutor, as_completed
  6. from multiprocessing import Pool
  7.  
  8. import numpy
  9. from tqdm import tqdm
  10.  
  11. # Majme teda (neefektívnu) funkciu, ktorá zistí či dané číslo je prvočíslo.
  12.  
  13. def is_prime(n):
  14. root = int(n**0.5)
  15. num = 1
  16. while num <= root:
  17. if n % num == 0:
  18. return False
  19. num += 1
  20. return True
  21.  
  22. # Majme pole na ktorej chceme testovať túto funkciu.
  23.  
  24. generator = range(10**7)
  25. args = [x for x in generator]
  26.  
  27. # Pozrime sa ako dlho bude trvať takejto funkcii vyhodnotiť toto pole.
  28.  
  29. timeFlag = time.time()
  30. result = []
  31. for arg in args:
  32. result.append(is_prime(arg))
  33. print "1.", time.time()-timeFlag, "s"
  34.  
  35. # Pre prípad, že by nás zaujímalo ako táto funkcia napreduje pri výpočte.
  36.  
  37. timeFlag = time.time()
  38. result = []
  39. for arg in tqdm(args):
  40. result.append(is_prime(arg))
  41. print "2.", time.time()-timeFlag, "s"
  42.  
  43. # Možno ale použiť pool z knižnice multiprocessing.
  44.  
  45. timeFlag = time.time()
  46. pool = Pool(processes=4)
  47. result = pool.map(is_prime, args)
  48. print "3.", time.time()-timeFlag, "s"
  49.  
  50. # Pri použití generátoru (yield) na vstupe sa efektivita poolu zníži, pretože
  51. # thready musia čakať kým dostanú z jedného generátoru ďalší vstup.
  52. # Pri krátkom behu generátoru je toto spomalenie relatívne malé.
  53.  
  54. timeFlag = time.time()
  55. pool = Pool(processes=4)
  56. result = pool.map(is_prime, generator)
  57. print "4.", time.time()-timeFlag, "s"
  58.  
  59. # Pozor takto sa nemusíme dozvedieť, že náš skript havaroval.
  60.  
  61. def is_prime_bad(n):
  62. root = int(n**0.5)
  63. num = 1
  64. while num <= root:
  65. if n % num == 0:
  66. return False
  67. # num je typu int, operácia += preto nie je povolená.
  68. num += "a"
  69. return True
  70.  
  71.  
  72. timeFlag = time.time()
  73. pool = Pool(processes=4)
  74. result = pool.map(is_prime_bad, args)
  75. print "5.", time.time()-timeFlag, "s"
  76.  
  77. # Pri dlhších procesoch je celkom nápomocné mať nejaký odhad ako dlho náš proces
  78. # bude spustený.
  79.  
  80. def parallel(function, array, n_jobs=4, use_kwargs=False):
  81. if n_jobs == 1:
  82. return [function(**a) if use_kwargs else function(a) for a in tqdm(array)]
  83.  
  84. with ProcessPoolExecutor(max_workers=n_jobs) as pool:
  85. if use_kwargs:
  86. futures = [pool.submit(function, **a) for a in array]
  87. else:
  88. futures = [pool.submit(function, a) for a in array]
  89. kwargs = {
  90. 'total': len(futures),
  91. 'unit': 'it',
  92. 'unit_scale': True,
  93. 'leave': True
  94. }
  95. for f in tqdm(as_completed(futures), **kwargs):
  96. pass
  97.  
  98. out = []
  99. for i, future in tqdm(enumerate(futures)):
  100. try:
  101. out.append(future.result())
  102. except Exception as e:
  103. out.append(e)
  104. return out
  105.  
  106.  
  107. timeFlag = time.time()
  108. result = parallel(is_prime, range(10**4), n_jobs=4)
  109. print "6.", time.time()-timeFlag, "s"
  110.  
  111. # S použitím kwargs.
  112.  
  113. def GCD(x, y):
  114. while(y):
  115. x, y = y, x % y
  116. return x
  117.  
  118.  
  119. args = [[random.randint(0, 2**12), random.randint(0, 2**12)]
  120. for x in range(10**4)]
  121. timeFlag = time.time()
  122. result = parallel(GCD, args, n_jobs=4)
  123. print "7.", time.time()-timeFlag, "s"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement