Skip to content

Instantly share code, notes, and snippets.

@kjsman
Created February 12, 2025 13:44
Show Gist options
  • Save kjsman/86775a1769b3650b8463f58bfa42c42a to your computer and use it in GitHub Desktop.
Save kjsman/86775a1769b3650b8463f58bfa42c42a to your computer and use it in GitHub Desktop.
pqdm: Portable tqdm that fits in your clipboard
# Licensed under the Zero-Clause BSD License (0BSD)
# See: https://opensource.org/licenses/0BSD
import sys
import time
def format_time(seconds):
m, s = divmod(int(seconds), 60)
return f"{m:02d}:{s:02d}"
class tqdm:
def __init__(self, iterable, desc="", total=None):
self.iterable = iter(iterable)
self.desc = desc
if total is None:
try:
self.total = len(iterable)
except Exception:
self.total = None
else:
self.total = total
self.count = 0
self.width = 40
self.last_update = 0
self.start_time = time.time()
self._display_progress(final=True)
def __iter__(self):
return self
def __next__(self):
try:
item = next(self.iterable)
except StopIteration:
self._display_progress(final=True)
raise
self.count += 1
if (time.time() - self.last_update) >= 0.1:
self._display_progress(final=False)
return item
def _display_progress(self, final):
now = time.time()
self.last_update = now
elapsed = now - self.start_time
elapsed_str = format_time(elapsed)
rate = self.count / elapsed if elapsed > 0 else 0.0
prefix = f"{self.desc}: " if self.desc else ""
if self.total:
if self.count > self.total:
frac = self.count / self.total
bar = '#' * self.width
percent = int(100 * frac)
remaining_str = "--:--"
else:
frac = self.count / self.total
filled = int(self.width * frac)
bar = '#' * filled + '-' * (self.width - filled)
percent = int(100 * frac)
remaining = (elapsed / self.count * self.total - elapsed) if self.count else 0
remaining_str = format_time(remaining)
progress = (f"{prefix}[{bar}] {percent}% ({self.count}/{self.total}) "
f"[{elapsed_str}<{remaining_str}, {rate:5.2f}it/s]")
else:
progress = f"{prefix}{self.count} items processed [{elapsed_str}<--:--, {rate:5.2f}it/s]"
sys.stderr.write(f"\r\033[K{progress}")
sys.stderr.flush()
if final and self.count > 0:
sys.stderr.write("\n")
sys.stderr.flush()
def trange(*args, **kwargs):
return tqdm(range(*args), **kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment