列表索引效率(python 2 与 python 3)

2024-03-07

在回答另一个question https://stackoverflow.com/q/11400163/748858,我建议使用timeit测试用正整数对列表进行索引和对列表进行索引之间的差异。负整数。这是代码:

import timeit
t=timeit.timeit('mylist[99]',setup='mylist=list(range(100))',number=10000000)
print (t)
t=timeit.timeit('mylist[-1]',setup='mylist=list(range(100))',number=10000000)
print (t)

我用 python 2.6 运行了这段代码:

$ python2.6 test.py
0.587687015533
0.586369991302

然后我用 python 3.2 运行它:

$ python3.2 test.py
0.9212150573730469
1.0225799083709717

然后我挠了挠头,做了一些谷歌搜索,并决定在这里发布这些观察结果。

操作系统:OS-X (10.5.8) -- Intel Core2Duo

对我来说,这似乎是一个非常显着的差异(差异超过 1.5 倍)。有谁知道为什么 python3 慢得多——尤其是对于这样一个常见的操作?

EDIT

我在 Ubuntu Linux 桌面 (Intel i7) 上运行了相同的代码,并使用 python2.6 和 python 3.2 获得了相当的结果。看来这是一个与操作系统(或处理器)相关的问题(其他用户在 Linux 机器上看到相同的行为 - 请参阅评论)。

EDIT 2

答案之一要求启动横幅,所以这里是:

Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin

and:

Python 3.2 (r32:88452, Feb 20 2011, 10:19:59) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin

UPDATE

我刚刚安装了新版本的 python2.7.3 和 python3.2.3http://www.python.org/download/ http://www.python.org/download/

在这两种情况下,我都采取了

“Python x.x.3 Mac OS X 32 位 i386/PPC 安装程序(适用于 Mac OS X 10.3 到 10.6 [2])”

因为我使用的是 OS X 10.5。以下是新的时间安排(通过多次试验,这些时间安排相当一致):

蟒蛇2.7

$python2.7 test.py
0.577006101608
0.590042829514

蟒蛇3.2.3

$python3.2 test.py
0.8882801532745361
1.034242868423462

这似乎是 Python 3.2 某些版本的产物。目前最好的假设是,所有 32 位 Intel 版本都会出现速度减慢的情况,但 64 位版本不会出现这种情况。请继续阅读以了解更多详细信息。

您没有进行足够多的测试来确定任何事情。重复测试多次,对于同一测试,我得到的值范围为 0.31 到 0.54,这是一个巨大的变化。

所以,我运行了你的测试10x数量,以及repeat=10,使用一堆不同的 Python2 和 Python3 安装。扔掉顶部和底部的结果,平均其他 8 个结果,然后除以 10(得到与您的测试相等的数字),这就是我所看到的:

 1. 0.52/0.53 Lion 2.6
 2. 0.49/0.50 Lion 2.7
 3. 0.48/0.48 MacPorts 2.7
 4. 0.39/0.49 MacPorts 3.2
 5. 0.39/0.48 HomeBrew 3.2

所以,看起来 3.2 实际上稍微快一些[99],并且速度与[-1].

然而,在 10.5 机器上,我得到了这些结果:

 1. 0.98/1.02 MacPorts 2.6
 2. 1.47/1.59 MacPorts 3.2

回到原来的 (Lion) 机器,我以 32 位模式运行,并得到以下结果:

 1. 0.50/0.48 Homebrew 2.7
 2. 0.75/0.82 Homebrew 3.2

所以,看起来 32 位才是最重要的,而不是 Leopard 与 Lion、gcc 4.0 与 gcc 4.2 或 clang、硬件差异等。这将有助于在 Leopard 下使用不同的编译器等测试 64 位构建..,但不幸的是我的 Leopard 盒子是第一代 Intel Mini(带有 32 位 Core Solo CPU),所以我无法进行该测试。

作为进一步的间接证据,我在 Lion 盒子上进行了大量其他快速测试,看起来 32 位 3.2 比 2.x 慢约 50%,而 64 位 3.2 可能比 2.x 快一点。 X。但如果我们真的想支持这一点,就需要有人选择并运行一个真正的基准测试套件。

不管怎样,我目前最好的猜测是,在优化 3.x 分支时,没有人在 32 位 i386 Mac 构建上投入太多精力。这对他们来说实际上是一个合理的选择。

或者,他们甚至没有在 32 位 i386 时期投入太多精力。这种可能性可以解释为什么 OP 看到 2.x 和 3.2 在 Linux 机器上给出相似的结果,而 Otto Allmendinger 看到 3.2 在 Linux 机器上同样慢于 2.6。但由于他们都没有提到他们运行的是 32 位还是 64 位 Linux,所以很难知道这是否相关。

我们还没有排除许多其他不同的可能性,但这似乎是最好的一种。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列表索引效率(python 2 与 python 3) 的相关文章

随机推荐