使用python->curses模块,我遇到了一个非常慢的如果我经常更改字符串的颜色,则绘制/刷新。我用C++编写了同样的程序,没有任何问题。代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import curses
import locale
# Inint global console config
locale.setlocale(locale.LC_ALL, '')
def main(stdscr):
curses.start_color()
curses.use_default_colors()
curses.init_pair(1, curses.COLOR_YELLOW, 0)
curses.init_pair(2, curses.COLOR_RED, 0)
max_rows, max_cols = stdscr.getmaxyx()
max_cont = max_rows * max_cols
try:
for i in range(1, max_cont):
stdscr.addstr('█', curses.color_pair(i % 2 + 1))
except curses.ERR:
pass
stdscr.refresh()
stdscr.getch()
curses.wrapper(main)
它很慢,因为程序会发送一个转义序列来更改屏幕上每个单元格的颜色。
也就是说,它不只是发送'█'
(一个3字节的UTF-8字符串),而是另外发送颜色信息。以可读的形式(使用unmap
),类似于以下内容:
E[31m
E[40m342226210
E[33m
E[40m342226210
E[31m
E[40m342226210
...
因为curses为每个单元格同时写入前景和背景颜色(因为少数终端无法独立完成)。转义序列为10个字节,数据为3个字节,使其速度慢了约4倍。