2016-03-29 3 views
0

python-> cursesモジュールを使用すると、文字列の色属性を多く変更すると、非常に遅い 描画/更新が発生します。 私はC++で同じプログラムを書いていて問題はありませんでした。 コード:プログラムは、画面上のすべてのセルの色を変更するには、エスケープシーケンスを送信するためPython curses、異なる連続した色でスローリフレッシュ

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

送信されるデータの量はここで問題になるとは思わない。 1つの色のペアを使用する場合、送信されるデータの量は同じですが、超高速で動作します。 –

関連する問題