我目前正在编写一个 python 程序,该程序涉及大量使用索引迷宫,如结构。我目前将列表设置为包含单独的嵌套列表,每个嵌套列表代表迷宫的一条线,我像 Maze[0][1] 一样为第一行和第二列上的网格迷宫的位置编制索引。如果我将迷宫转换为单个列表,同时跟踪一行的长度并相应地在列表中移动,我的程序会运行得更快吗?如果我使用 Maze[(0*row_length)+1] 而不是 Maze[0][1],我将获得多少速度提升?
问问题
218 次
2 回答
2
不要打扰。这几乎肯定不是您的瓶颈,而且管理索引计算和行长度变量不值得头疼。
时序数据:
>>> timeit("a[1][2]", setup="a = [[0]*5 for _ in xrange(4)]")
0.09207810811146055
>>> timeit("a[1*5+2]", setup="a = [0]*5*4")
0.06518904043262097
>>> timeit("a[1*row_length+2]", setup="a = [0]*5*4; row_length=5")
0.11411290029380439
当行长是内联常量时,扁平化列表获胜,但当行长是全局变量时,它会丢失。如果你试图通过扁平化你的列表来获得优势,你将浪费大量时间来管理索引,除非你非常小心,否则它甚至可能运行得更慢。不要打扰。
于 2013-07-20T03:54:21.943 回答
0
要进一步扩展,请运行以下命令:
from timeit import timeit
class slice_list(list):
def __getitem__(self, iindex):
return list.__getslice__(self, (iindex * 5), ((iindex + 1) * 5))
nested_list = \
[
["X", "X", "X", "X", "X"],
["X", " ", " ", " ", "X"],
["X", "X", "O", " ", "X"],
["X", "@", " ", " ", "X"],
["X", "X", "X", "X", "X"]
]
flat_list = \
[
"X", "X", "X", "X", "X",
"X", " ", " ", " ", "X",
"X", "X", "O", " ", "X",
"X", "@", " ", " ", "X",
"X", "X", "X", "X", "X"
]
s_list = slice_list(flat_list)
nested_setup_str = \
'''
from __main__ import nested_list
test = nested_list
'''
flat_setup_str = \
'''
from __main__ import flat_list
test = flat_list
'''
slice_setup_str = \
'''
from __main__ import s_list
test = s_list
'''
print "Flat:", timeit("test[1 * 5 + 2]", setup=flat_setup_str)
print "Nested:", timeit("test[1][2]", setup=nested_setup_str)
print "Sliced:", timeit("test[1][2]", setup=slice_setup_str)
我有:
Flat: 0.1130175887
Nested: 0.182156054306
Sliced: 1.92594956774
所以无论你从一个平面列表中获得什么收益,它都会被试图将它视为一个嵌套列表来破坏(在上面的例子中使用类似于 slice_list 的东西)。
如果性能是一个问题,也许可以考虑一个 numpy 数组(尽管您可能必须创建一个数字到符号的映射)。
于 2013-07-22T01:56:47.423 回答