我在 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
是无用的,因为您使用 int
s 作为键。
你试过理解吗?
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”。
我试图在 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
是无用的,因为您使用 int
s 作为键。
你试过理解吗?
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”。