window下tqdm进度条

原代码是linux下运行,修改后可在window下运行。

#ifndef TQDM_H
#define TQDM_H

#include <chrono>
#include <ctime>
#include <numeric>
#include <ios>
#include <string>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
#include <io.h>
class tqdm {
private:
	// time, iteration counters and deques for rate calculations
	std::chrono::time_point<std::chrono::system_clock> t_first = std::chrono::system_clock::now();
	std::chrono::time_point<std::chrono::system_clock> t_old = std::chrono::system_clock::now();
	int n_old = 0;
	std::vector<double> deq_t;
	std::vector<int> deq_n;
	int nupdates = 0;
	int total_ = 0;
	int period = 1;
	unsigned int smoothing = 50;
	bool use_ema = true;
	float alpha_ema = 0.1;

	std::vector<const char*> bars = { " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█" };

	bool in_screen = (system("test $STY") == 0);
	bool in_tmux = (system("test $TMUX") == 0);
	bool is_tty = _isatty(1);
	bool use_colors = true;
	bool color_transition = true;
	int width = 40;

	std::string right_pad = "▏";
	std::string label = "";

	void hsv_to_rgb(float h, float s, float v, int& r, int& g, int& b) {
		if (s < 1e-6) {
			v *= 255.;
			r = v; g = v; b = v;
		}
		int i = (int)(h*6.0);
		float f = (h*6.) - i;
		int p = (int)(255.0*(v*(1. - s)));
		int q = (int)(255.0*(v*(1. - s * f)));
		int t = (int)(255.0*(v*(1. - s * (1. - f))));
		v *= 255;
		i %= 6;
		int vi = (int)v;
		if (i == 0) { r = vi; g = t;  b = p; }
		else if (i == 1) { r = q;  g = vi; b = p; }
		else if (i == 2) { r = p;  g = vi; b = t; }
		else if (i == 3) { r = p;  g = q;  b = vi; }
		else if (i == 4) { r = t;  g = p;  b = vi; }
		else if (i == 5) { r = vi; g = p;  b = q; }
	}

public:
	tqdm() {
		if (in_screen) {
			set_theme_basic();
			color_transition = false;
		}
		else if (in_tmux) {
			color_transition = false;
		}
	}

	void reset() {
		t_first = std::chrono::system_clock::now();
		t_old = std::chrono::system_clock::now();
		n_old = 0;
		deq_t.clear();
		deq_n.clear();
		period = 1;
		nupdates = 0;
		total_ = 0;
		label = "";
	}

	void set_theme_line() { bars = { "─", "─", "─", "╾", "╾", "╾", "╾", "━", "═" }; }
	void set_theme_circle() { bars = { " ", "◓", "◑", "◒", "◐", "◓", "◑", "◒", "#" }; }
	void set_theme_braille() { bars = { " ", "⡀", "⡄", "⡆", "⡇", "⡏", "⡟", "⡿", "⣿" }; }
	void set_theme_braille_spin() { bars = { " ", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠇", "⠿" }; }
	void set_theme_vertical() { bars = { "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "█" }; }
	void set_theme_basic() {
		bars = { " ", " ", " ", " ", " ", " ", " ", " ", "#" };
		right_pad = "|";
	}
	void set_label(std::string label_) { label = label_; }
	void disable_colors() {
		color_transition = false;
		use_colors = false;
	}

	void finish() {
		progress(total_, total_);
		printf("\n");
		fflush(stdout);
	}
	void progress(int curr, int tot) {
		if (is_tty && (curr%period == 0)) {
			total_ = tot;
			nupdates++;
			auto now = std::chrono::system_clock::now();
			double dt = ((std::chrono::duration<double>)(now - t_old)).count();
			double dt_tot = ((std::chrono::duration<double>)(now - t_first)).count();
			int dn = curr - n_old;
			n_old = curr;
			t_old = now;
			if (deq_n.size() >= smoothing) deq_n.erase(deq_n.begin());
			if (deq_t.size() >= smoothing) deq_t.erase(deq_t.begin());
			deq_t.push_back(dt);
			deq_n.push_back(dn);

			double avgrate = 0.;
			if (use_ema) {
				avgrate = deq_n[0] / deq_t[0];
				for (unsigned int i = 1; i < deq_t.size(); i++) {
					double r = 1.0*deq_n[i] / deq_t[i];
					avgrate = alpha_ema * r + (1.0 - alpha_ema)*avgrate;
				}
			}
			else {
				double dtsum = std::accumulate(deq_t.begin(), deq_t.end(), 0.);
				int dnsum = std::accumulate(deq_n.begin(), deq_n.end(), 0.);
				avgrate = dnsum / dtsum;
			}

			// learn an appropriate period length to avoid spamming stdout
			// and slowing down the loop, shoot for ~25Hz and smooth over 3 seconds
			if (nupdates > 10) {
				period = (int)(std::min(std::max((1.0 / 25)*curr / dt_tot, 1.0), 5e5));
				smoothing = 25 * 3;
			}
			double peta = (tot - curr) / avgrate;
			double pct = (double)curr / (tot*0.01);
			if ((tot - curr) <= period) {
				pct = 100.0;
				avgrate = tot / dt_tot;
				curr = tot;
				peta = 0;
			}

			double fills = ((double)curr / tot * width);
			int ifills = (int)fills;

			printf("\015 ");
			if (use_colors) {
				if (color_transition) {
					// red (hue=0) to green (hue=1/3)
					int r = 255, g = 255, b = 255;
					hsv_to_rgb(0.0 + 0.01*pct / 3, 0.65, 1.0, r, g, b);
					printf("\033[38;2;%d;%d;%dm ", r, g, b);
				}
				else {
					printf("\033[32m ");
				}
			}
			for (int i = 0; i < ifills; i++) std::cout << bars[8];
			if (!in_screen && (curr != tot)) printf("%s", bars[(int)(8.0*(fills - ifills))]);
			for (int i = 0; i < width - ifills - 1; i++) std::cout << bars[0];
			printf("%s ", right_pad.c_str());
			if (use_colors) printf("\033[1m\033[31m");
			printf("%4.1f%% ", pct);
			if (use_colors) printf("\033[34m");

			std::string unit = "Hz";
			double div = 1.;
			if (avgrate > 1e6) {
				unit = "MHz"; div = 1.0e6;
			}
			else if (avgrate > 1e3) {
				unit = "kHz"; div = 1.0e3;
			}
			printf("[%4d/%4d | %3.1f %s | %.0fs<%.0fs] ", curr, tot, avgrate / div, unit.c_str(), dt_tot, peta);
			printf("%s ", label.c_str());
			if (use_colors) printf("\033[0m\033[32m\033[0m\015 ");

			if ((tot - curr) > period) fflush(stdout);

		}
	}
};
#endif

主函数: 

#include "MyClass.h"
#include <windows.h>
int main() {

	int N = 2000;
	tqdm bar;

	std::cout << "Overhead of loop only:" << std::endl;
	for (int i = 0; i < 100000000; i++) {
		bar.progress(i, 100000000);
	}
	bar.finish();


	std::cout << "Basic:" << std::endl;
	bar.reset();
	bar.set_theme_basic();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(1000);
	}
	bar.finish();

	std::cout << "Braille:" << std::endl;
	bar.reset();
	bar.set_theme_braille();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(300);
	}
	bar.finish();

	std::cout << "Line:" << std::endl;
	bar.reset();
	bar.set_theme_line();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(300);
	}
	bar.finish();

	std::cout << "Circles:" << std::endl;
	bar.reset();
	bar.set_theme_circle();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(300);
	}
	bar.finish();

	bar.reset();
	std::cout << "Vertical bars:" << std::endl;
	bar.reset();
	bar.set_theme_vertical();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(3000);
	}
	bar.finish();

	return 0;
}

源码 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/795922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS 通过Docker安装宝塔面板搭建PHP开发环境

1、docker拉取ubuntu系统 docker pull ubuntu2、运行容器 docker run -i -t -d --name bt -p 20:20 -p 21:21 -p 80:80 -p 443:443 -p 888:888 -p 8888:8888 -p 3306:3306 -p 6379:6379 --privilegedtrue -v /Users/oi/Sites:/www/wwwroot ubuntu-v 后的 /Users/oi/Sites 代表…

分布式系统—Ceph块存储系统(RBD接口)

目录 一、服务端操作 1 创建一个名为 rbd-xy101 的专门用于 RBD 的存储池 2 将存储池转换为 RBD 模式 3 初始化存储池 4 创建镜像 5 管理镜像 6.Linux客户端使用 在管理节点创建并授权一个用户可访问指定的 RBD 存储池 ​编辑修改RBD镜像特性&#xff0c;CentOS7默认情…

fastadmin 如何通过权限组来控制列的显示与隐藏

方法1 以版本控制&#xff08;application/admin/controller/Version.php&#xff09;为例子 需求 就是在有时候&#xff0c;有些列不想让这个权限组的人看到&#xff0c;只给制定的权限组的人看 1.给权限组创建一个字段 ALTER TABLE lt_auth_group ADD COLUMN isBoothView T…

RMAN备份与还原

进入 rman 工具 rman target / 查看 rman 配置 rman> show all; 修改rman 配置 数据库全备 rman> run {allocate channel c1 type disk;allocate channel c2 type disk;backup incremental level 0 database format /home/oracle/backup/full_%d_%s_%t.bak;sql alte…

连接与隔离:Facebook在全球化背景下的影响力

在当今全球化的背景下&#xff0c;Facebook作为全球最大的社交网络平台&#xff0c;不仅连接了世界各地的人们&#xff0c;还在全球社会、经济和文化中发挥着深远的影响。本文将深入探讨Facebook在全球化进程中的作用&#xff0c;以及其对个体和社会之间连接与隔离的双重影响。…

C/C++ 进阶(7)模拟实现map/set

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 一、简介 map和set都是关联性容器&#xff0c;底层都是用红黑树写的。 特点&#xff1a;存的Key值都是唯一的&#xff0c;不重复。 map存的是键值对&#xff08;Key—Value&#xff09;。 set存的是键…

我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程

Minecraft&#xff08;MC&#xff09;1.21版多种服务端开服教程&#xff0c;我的世界1.21服务器搭建教程&#xff0c;MC原版/Forge/Fabric/Paper/Mohist服务端搭建教程&#xff0c;我的世界MOD/插件服开服教程。 本教程使用 Linux系统MCSManager 面板来搭建Minecraft服务器。 …

每天一个数据分析题(四百二十七)- 方差分析

下面是一个方差分析表&#xff1a; 表中A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E五个单元格内的数据分别是&#xff08; &#xff09;。 A. 40&#xff0c;5&#xff0c;35&#xff0c;60&#xff0c;1.71 B. 40&#xff0c;5&#xff0c;35&#xff0c;60&a…

ES 慢上游响应问题优化在用户体验场景中的实践

在抖音亿级日活流量的情况下&#xff0c;每天收到的用户反馈也是大量的&#xff0c;而用户反馈对于产品的发展与未来是至关重要的&#xff0c;因此用户体验管理平台&#xff08;简称VoC&#xff09;就应运而生&#xff0c;VoC 平台旨在通过技术平台化的方式&#xff0c;结合反馈…

Spring系统学习 - Spring事务的概念

提到事务&#xff0c;这个我们应该比较熟悉了&#xff0c;在数据库学习的过程中&#xff0c;我们或多或少接触过了事务&#xff0c;当然你可能没有用到&#xff0c;也可能用到了&#xff0c;这篇博客我们将围绕Spring的相关事务的概念进行&#xff0c;了解Spring中的事务和事务…

ChatGPT Mac App 发布!

2024 年 6 月&#xff0c;OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面&#xff0c;用户可以在其中输入文本或语音指令&#xff0c;并接收模型生成…

JavaDS —— 栈 Stack 和 队列 Queue

栈的概念 栈是一种先进后出的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶&#xff0c;另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子&#xff1a; 栈的模拟实现 下面是Jav…

对照ui图进行大屏幕适配,echerts适配

1.先找到ui图&#xff0c;我这边是1920*1080的屏幕进行的设计 2.在界面找到跟样式的字体大小&#xff0c;进行设置&#xff0c;一般ui设置字体大小便可 3.在js中写入原生js代码 function adapter() {//获取布局视口宽度&#xff0c;布局视口设备横向独立像素值const dpWidth…

在 PostgreSQL 里如何处理数据的归档和清理策略的优化?

文章目录 在 PostgreSQL 中处理数据归档和清理策略的优化一、理解数据归档和清理的重要性二、确定归档和清理的标准三、PostgreSQL 中的数据归档方法&#xff08;一&#xff09;使用分区表&#xff08;二&#xff09;导出数据 四、PostgreSQL 中的数据清理方法&#xff08;一&a…

web3.0的业务场景分析

Web3.0作为互联网的下一个阶段&#xff0c;其核心特点是去中心化、自治、安全和透明。相比于Web2.0&#xff0c;Web3.0将用户数据的所有权和控制权归还给用户&#xff0c;并通过区块链技术等手段确保数据的安全和透明。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

Uniapp鸿蒙项目实战

Uniapp鸿蒙项目实战 24.7.6 Dcloud发布了uniapp兼容鸿蒙的文档&#xff1a;Uniapp开发鸿蒙应用 在实际使用中发现一些问题&#xff0c;开贴记录一下 设备准备 windows电脑准备&#xff08;家庭版不行&#xff0c;教育版、企业版、专业版也可以&#xff0c;不像uniapp说的只有…

LeetCode - #93 复原 IP 地址

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Sw…

kotlin数据容器

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 容器是用于存放数据的载体。容器分为数组、集合。 Kotlin作为一门全新的语言&#xff0c;肯定还是要有自己的容…

html设计(两种常见的充电效果)

第一种 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

线性代数|机器学习-P23梯度下降

文章目录 1. 梯度下降[线搜索方法]1.1 线搜索方法&#xff0c;运用一阶导数信息1.2 经典牛顿方法&#xff0c;运用二阶导数信息 2. hessian矩阵和凸函数2.1 实对称矩阵函数求导2.2. 线性函数求导 3. 无约束条件下的最值问题4. 正则化4.1 定义4.2 性质 5. 回溯线性搜索法 1. 梯度…