Guest User

Untitled

a guest
Nov 23rd, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. __all__ = ['tqdm', 'trange']
  2.  
  3. import sys
  4. import time
  5.  
  6. try:
  7. from IPython.core.display import clear_output
  8. _clear = lambda *args: clear_output(wait=True)
  9. is_ipython = True
  10. except ImportError:
  11. _clear = lambda *args: sys.stdout.write('\r')
  12. is_ipython = False
  13.  
  14. def format_interval(t):
  15. mins, s = divmod(int(t), 60)
  16. h, m = divmod(mins, 60)
  17. if h:
  18. return '%d:%02d:%02d' % (h, m, s)
  19. else:
  20. return '%02d:%02d' % (m, s)
  21.  
  22.  
  23. def format_meter(n, total, elapsed):
  24. # n - number of finished iterations
  25. # total - total number of iterations, or None
  26. # elapsed - number of seconds passed since start
  27. if n > total:
  28. total = None
  29.  
  30. elapsed_str = format_interval(elapsed)
  31. rate = '%5.2f' % (n / elapsed) if elapsed else '?'
  32.  
  33. if total:
  34. frac = float(n) / total
  35.  
  36. N_BARS = 10
  37. bar_length = int(frac*N_BARS)
  38. bar = '#'*bar_length + '-'*(N_BARS-bar_length)
  39.  
  40. percentage = '%3d%%' % (frac * 100)
  41.  
  42. left_str = format_interval(elapsed / n * (total-n)) if n else '?'
  43.  
  44. return '|%s| %d/%d %s [elapsed: %s left: %s, %s iters/sec]' % (
  45. bar, n, total, percentage, elapsed_str, left_str, rate)
  46.  
  47. else:
  48. return '%d [elapsed: %s, %s iters/sec]' % (n, elapsed_str, rate)
  49.  
  50.  
  51. class StatusPrinter(object):
  52. def __init__(self, file):
  53. self.file = file
  54. self.last_printed_len = 0
  55.  
  56. def print_status(self, s):
  57. _clear()
  58. self.file.write(s+' '*max(self.last_printed_len-len(s), 0))
  59. self.file.flush()
  60. self.last_printed_len = len(s)
  61.  
  62.  
  63. def tqdm(iterable, desc='', total=None, leave=False, file=sys.stderr,
  64. mininterval=0.5, miniters=1):
  65. """
  66. Get an iterable object, and return an iterator which acts exactly like the
  67. iterable, but prints a progress meter and updates it every time a value is
  68. requested.
  69. 'desc' can contain a short string, describing the progress, that is added
  70. in the beginning of the line.
  71. 'total' can give the number of expected iterations. If not given,
  72. len(iterable) is used if it is defined.
  73. 'file' can be a file-like object to output the progress message to.
  74. If leave is False, tqdm deletes its traces from screen after it has
  75. finished iterating over all elements.
  76. If less than mininterval seconds or miniters iterations have passed since
  77. the last progress meter update, it is not updated again.
  78. """
  79. if total is None:
  80. try:
  81. total = len(iterable)
  82. except TypeError:
  83. total = None
  84.  
  85. prefix = desc+': ' if desc else ''
  86.  
  87. sp = StatusPrinter(file)
  88. sp.print_status(prefix + format_meter(0, total, 0))
  89.  
  90. start_t = last_print_t = time.time()
  91. last_print_n = 0
  92. n = 0
  93. for obj in iterable:
  94. yield obj
  95. # Now the object was created and processed, so we can print the meter.
  96. n += 1
  97. if n - last_print_n >= miniters:
  98. # We check the counter first, to reduce the overhead of time.time()
  99. cur_t = time.time()
  100. if cur_t - last_print_t >= mininterval:
  101. sp.print_status(prefix + format_meter(n, total, cur_t-start_t))
  102. last_print_n = n
  103. last_print_t = cur_t
  104.  
  105. if not leave:
  106. sp.print_status('')
  107. _clear()
  108. else:
  109. if last_print_n < n:
  110. cur_t = time.time()
  111. sp.print_status(prefix + format_meter(n, total, cur_t-start_t))
  112. file.write('\n')
  113.  
  114.  
  115. def trange(*args, **kwargs):
  116. """A shortcut for writing tqdm(range()) on py3 or tqdm(xrange()) on py2"""
  117. try:
  118. f = xrange
  119. except NameError:
  120. f = range
  121.  
  122. return tqdm(f(*args), **kwargs)
Add Comment
Please, Sign In to add comment