2016-03-29 49 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

我不認爲發送的數據量是問題,因爲正如我所說的,只有在顏色交替時纔會變慢。如果我僅使用一種顏色對,發送的數據量是相同的,但它工作速度非常快。 –