索引嵌套列表

时间:2013-07-20 03:44:52

标签: python indexing

我目前正在编写一个python程序,其中大量使用索引迷宫,如结构。我目前已经将列表设置为包含单独的嵌套列表,每个嵌套列表代表迷宫的一行,我对其进行索引,因此Maze [0] [1]用于第一行和第二列的网格迷宫的位置。如果我将迷宫转换为单个列表,同时跟踪行的长度,并相应地移动列表,我的程序是否会运行得更快。如果我使用迷宫[(0 * row_length)+1]而不是迷宫[0] [1],我会获得多少速度提升?

2 个答案:

答案 0 :(得分: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

当行长度为内联常量时,展平列表获胜,但当行长度为全局变量时,它会丢失。如果你试图通过展平列表来获得优势,那么你将浪费大量时间来管理索引,除非你非常小心地执行它,否则它甚至可能会运行得更慢。不要打扰。

答案 1 :(得分: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数组(尽管你可能需要创建一个数字到符号映射)。