import os
import sys
import shutil
from time import perf_counter
from collections import defaultdict
from datetime import timedelta
from typing import Sequence, List, Dict, Hashable, Callable
from config.common import DEBUG
from logger import base_logger
utils_logger = base_logger.getChild('utils')
def progressbar(it: Sequence, name: str = 'In Progress', bar_length: int = 20, file=sys.stdout, verbose=False):
def show(i):
total = len(it)
bar_progress = bar_length * i // total
consumedsec = stepsec - startsec
file.write(
f'{name} {it[i-1] if verbose else ""}: '
f'[{"#" * bar_progress}{"." * (bar_length - bar_progress)}] '
f'{i}/{total} ({i / total:.2%}) '
f'Time consumed: {timedelta(seconds=round(consumedsec))}; '
f'Time left (approx.): {timedelta(seconds=round((total-i) / (i/consumedsec))) if i != 0 else "--"}\r'
)
file.flush()
startsec = stepsec = perf_counter()
show(0)
for i, item in enumerate(it, start=1):
yield item
stepsec = perf_counter()
show(i)
file.write("\n")
file.flush()
def overwrite_dir(dir_name: str):
if os.path.isdir(dir_name):
shutil.rmtree(dir_name)
os.makedirs(dir_name)
def makedirs_if_not_exists(dir_name: str):
if not os.path.isdir(dir_name):
os.makedirs(dir_name)
def group_listofdict_bykey(entries: List[Dict], k: Hashable):
result = defaultdict(list)
for entry in entries:
result[entry[k]].append(entry)
return result
def debug_run(func: Callable, *args, **kwargs):
if DEBUG:
return func(*args, **kwargs)
def timer(func: Callable):
def wrapper(*args, **kwargs):
start = perf_counter()
res = func(*args, **kwargs)
utils_logger.debug('%.3f sec taken by function %s',
perf_counter() - start, func.__name__)
return res
return wrapper
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)