我在 for 循环中打印了很多项目,但是 for 循环不够快

I'm printing a lot of items in a for loop, but the for loop isn't fast enough

我试图在 for 循环中打印列表中的大量字符串。它工作正常,但它太慢了。有什么方法可以让它更快吗?

import time
import os

board = {
        1:[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        2:[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        3:[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        4:[' ','@',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        5:['#','#','#','#','#','#','#','#','#','#','#','#'],
}
while True:
        os.system('clear')
        v = 1
        while v < 6:
                for i in board[v]:
                        print(i, end = ' ')
                v += 1
                print('')

最后效果不错,就是打印速度太慢了。 (它使文本闪烁。)有没有办法加快速度使其看起来一致?

在使用像你这样的小矩阵时,C++ 也会出现文本闪烁(我有同样的问题 here)。


我认为这不会优化您的代码,但我建议您在此范围内使用 list 而不是 dict

board = [0,
    [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
    [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
    [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
    [' ','@',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
    ['#','#','#','#','#','#','#','#','#','#','#','#']
]

这将做同样的事情,在这种情况下 dict 是无用的,因为您使用 ints 作为键。

你试过理解吗?

board = {
    1: [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    2: [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    3: [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    4: [' ', '@', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    5: ['#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'],
}
[[print(i, end=' ') for i in board[v + 1]] for v in range(len(board))]

如果棋盘状态真的是这样管理的,你可以逐行打印而不是一个字符一个字符地打印:

for row in board:
    print(''.join(row))

或者计算整个块并在清除后立即发出单个打印命令,并且仅当它实际发生变化时才发出。

def format_board(board):
    return '\n'.join(''.join(row) for row in board)

while True:
    if format_board(board) != board_lastchange_string:
        os.system('clear')
        print(format_board(board))

# if you update the board somewhere, save
# `format_board(board)` to `board_lastchange_string`

游戏刷新画面自有来龙去脉。这个想法不是在帧之间清除屏幕。

import time
import os
import atexit

def clear():
  print ("{}[2J{}[;H".format(chr(27), chr(27)), end="")
  return

def move_to(row,col):
  print("{}[{};{}H".format(chr(27), row, col), end="")
  return

def hide_cursor():
  print('{}[?25l'.format(chr(27)), end="")
  return

def show_cursor():
  print('{}[?25h'.format(chr(27)), end="")
  return

atexit.register(show_cursor)

board = {
        1:[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        2:[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        3:[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        4:[' ','@',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
        5:['#','#','#','#','#','#','#','#','#','#','#','#'],
}
clear()
hide_cursor()
while True:
        move_to(0,0)
        v = 1
        while v < 6:
                for i in board[v]:
                        print(i, end = ' ')
                v += 1
                print('')
show_cursor()

然后你可以只刷新屏幕上发生变化的部分。

这仅在终端支持 ANSI Escape sequences 的情况下有效,但这似乎没问题,因为您已经使用了“clear”。