2016-03-29 22 views
0

使用python-> curses模块时,如果我拼凑字符串颜色属性,我会遇到非常缓慢的 绘制/刷新。 我用C++编写了相同的程序,并没有问题。 代码:Python诅咒,缓慢刷新不同的连续颜色

#!/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) 

回答

0

它是缓慢的,因为该程序发送一个转义序列来改变颜色在屏幕上的每一个细胞。

也就是说,它不是只发送'█'(一个3字节的UTF-8字符串),而是另外发送颜色信息。在可读的形式(与unmap),像这样:

\E[31m 
\E[40m\342\226\210 
\E[33m 
\E[40m\342\226\210 
\E[31m 
\E[40m\342\226\210 
... 

因为诅咒每个细胞都写在前景色和背景色(因为一些终端不能独立做这些)。这对于转义序列是10个字节,数据是3个字节,使其减慢了约4倍。

+0

但是为什么用C++编写的代码非常快?即使我改变'█'的字符,例如'A'仍然很慢。 –

+0

Python是一个解释器,比C++中的编译器应用程序有更多的工作要做。 –

+0

我不认为发送的数据量是问题,因为正如我所说的,只有在颜色交替时才会变慢。如果我仅使用一种颜色对,发送的数据量是相同的,但它工作速度非常快。 –