Python 从列表和字典返回值
我正在做一个象棋引擎,对于我的棋子方桌,我可以使用列表或字典。由于工件平方表的实现使引擎速度降低了两倍,我想知道是否使用了错误的数据结构。我正在使用列表,但我想知道字典是否是一个更好的主意 列表示例:Python 从列表和字典返回值,python,Python,我正在做一个象棋引擎,对于我的棋子方桌,我可以使用列表或字典。由于工件平方表的实现使引擎速度降低了两倍,我想知道是否使用了错误的数据结构。我正在使用列表,但我想知道字典是否是一个更好的主意 列表示例: list_ex = [50, 30, 30, 30 20, 30, 50, 40] call = list_ex[2] 字典示例: dict_ex = {0: 50, 1: 30, 2: 30, 3: 30, 4: 20, 5: 30, 6: 50,
list_ex = [50, 30, 30, 30
20, 30, 50, 40]
call = list_ex[2]
字典示例:
dict_ex = {0: 50, 1: 30, 2: 30, 3: 30,
4: 20, 5: 30, 6: 50, 7: 40}
call = dict_ex[2]
如您所见,我总是知道索引,我只需要返回与该索引关联的值。哪个数据结构更快,字典还是列表?正如您在python wiki上看到的,
list
和dict
它们在获得一个O(1)项的平均情况下具有相同的复杂性。因此,对于简单的基于索引的查找,应该没有太大的区别
编辑:我刚刚编写了一个小的基准测试代码,它获取第一个元素,一个来自中心,另一个来自最后。您可以看到一个列表有一个小的改进(尽管考虑到代码运行1000000次,0.01s的偏差并不是很大)
总之,如果我处于您的情况,我会使用列表,因为它也更适合基于索引的请求问题
>>> from timeit import Timer
>>> t=Timer("(l[0], l[3], l[7])","l=[50, 30, 30, 30, 20, 30, 50, 40]")
>>> sorted(t.repeat(5))
[0.17861513267149576, 0.17863279532627985, 0.17883092423682, 0.17892576501373014, 0.18901037296996037]
>>> t=Timer("(l[0], l[3], l[7])","l={0: 50, 1: 30, 2: 30, 3: 30, 4: 20, 5: 30, 6: 50, 7: 40}")
>>> sorted(t.repeat(5))
[0.18541179903735383, 0.1855488765975224, 0.1855757545505412, 0.18578041096390052, 0.21753940019925722]
对于这样的事情,Python通常会比较慢 看看另一个,第一个答案 如果你的对象是不可变的,我认为你最好的选择是元组。如果没有,那就坚持列表。无论是哪种方式,
list
和dict
之间都不会有太大的区别
我看到halex也刚刚回答了这个问题,而且似乎同意。您可以很容易地用模块(
python-m timeit-S“setup”--“statement”
)对其进行基准测试。但在这种情况下,我可以告诉你字典不会比列表更好,因为列表查找与dict查找相比微不足道。两者都将是快速的,独立于密钥和集合中的项目数量,但列表将在微观基准上获胜当然,这不应该决定你的决定。追求清晰,优化算法,而不是无关紧要的细节,过早的优化等等
但我仍然认为列表更合适,无论是在语义上(你没有自由形式的映射,你有一个序列),还是在防止错误方面(通过拒绝超出范围和非整数索引)。就查找速度而言,使用列表比使用dict更好。Tuple甚至更快一点
timeit dict_ex[2]
10000000 loops, best of 3: 148 ns per loop
timeit list_ex[2]
10000000 loops, best of 3: 116 ns per loop
tuple_ex=tuple(list_ex)
timeit tuple_ex[2]
10000000 loops, best of 3: 112 ns per loop
不允许我只编辑一个字符,但请注意,在您的字典示例中,您的语法是错误的——您以
[
开头,而不是{
。你的引擎在pypy下运行得更快吗?这里的一个集合完全错误,因为顺序和重复性很重要。@delnan,对不起,你完全正确。错误的单词,让我来解决。我们开始了。我们打算写元组。
。很好。另外,如果你是因为集合而投了反对票,我会很感激你的将删除否决票。这只是一个弗洛伊德式的失误。谢谢。我将坚持我的原始数据结构(列表)然后。你也在计时元组的创建。@StevenRumbalski我承认,我测量的绝对时间对于推断获取一个元素所需的时间没有意义,但我感兴趣的是这两种方法中哪一种更快,因此我同时计时元组的创建,所以如果我在时间上有所不同,我会添加重要性和创建时间元组的时间消失了。@halex:不要创建元组。与其使用“(l[0],l[3],l[7])”
,不如使用“l[0];l[1];l[2];l[3];l[4];l[5];l[6];l[7]”
。分号分隔语句。通过这些更改,列表在我的系统上显示速度提高了25%。(我还更改了测试以访问每个元素,以捕获最佳和最坏情况场景。)