Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表和字典返回值_Python - Fatal编程技术网

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%。(我还更改了测试以访问每个元素,以捕获最佳和最坏情况场景。)