projektAI/venv/Lib/site-packages/mlxtend/utils/counter.py
2021-06-06 22:13:05 +02:00

93 lines
2.8 KiB
Python

# Sebastian Raschka 2014-2020
# mlxtend Machine Learning Library Extensions
#
# A counter class for printing the progress of an iterator.
# Author: Sebastian Raschka <sebastianraschka.com>
#
# License: BSD 3 clause
import time
import sys
class Counter(object):
"""Class to display the progress of for-loop iterators.
Parameters
----------
stderr : bool (default: True)
Prints output to sys.stderr if True; uses sys.stdout otherwise.
start_newline : bool (default: True)
Prepends a new line to the counter, which prevents overwriting counters
if multiple counters are printed in succession.
precision: int (default: 0)
Sets the number of decimal places when displaying the time elapsed in
seconds.
name : string (default: None)
Prepends the specified name before the counter to allow distinguishing
between multiple counters.
Attributes
----------
curr_iter : int
The current iteration.
start_time : float
The system's time in seconds when the Counter was initialized.
end_time : float
The system's time in seconds when the Counter was last updated.
Examples
--------
>>> cnt = Counter()
>>> for i in range(20):
... # do some computation
... time.sleep(0.1)
... cnt.update()
20 iter | 2 sec
>>> print('The counter was initialized.'
' %d seconds ago.' % (time.time() - cnt.start_time))
The counter was initialized 2 seconds ago
>>> print('The counter was last updated'
' %d seconds ago.' % (time.time() - cnt.end_time))
The counter was last updated 0 seconds ago.
For more usage examples, please see
http://rasbt.github.io/mlxtend/user_guide/utils/Counter/
"""
def __init__(self, stderr=False, start_newline=True, precision=0,
name=None):
if stderr:
self.stream = sys.stderr
else:
self.stream = sys.stdout
if isinstance(precision, int):
self.precision = '%%.%df' % precision
else:
self.precision = '%d'
self.name = name
if self.name is None:
self._print_name = ''
else:
self._print_name = '%s: ' % self.name
self.start_time = time.time()
self.curr_iter = 0
if start_newline:
self.stream.write('\n')
def update(self):
"""Print current iteration and time elapsed."""
self.curr_iter += 1
self.end_time = time.time()
out = '%d iter | %s sec' % (self.curr_iter,
self.precision % (self.end_time
- self.start_time))
self.stream.write('\r%s%s' % (self._print_name, out))
self.stream.flush()