【问题标题】:Python3.1 performance still disappointing - will it get better? [closed]Python3.1 的性能仍然令人失望——它会变得更好吗? [关闭]
【发布时间】:2010-12-11 16:52:49
【问题描述】:

这是我编写的一个小程序,用于测量由于各种原因对我很重要的函数的速度:

import time,sys

count = 10 * 1000 * 1000
t1 = time.time()

d = dict()
for i in xrange(0,count):
    d[i] = i
for i in xrange(0,count):
    d[i] = d[i]*i
for i in xrange(0,count):
    d[i] = d[i]-i
t2 = time.time()

print("time=%f" % (t2-t1))
print("size of dictionary: %d" % sys.getsizeof(d))

所以我在我的 mac 上用 Python2.7 运行它并得到:

$ python2.7 pyspeed.py
time= 7.24679493904
size of dictionary: 402653464
$ python2.7 pyspeed.py
time= 7.23868012428
size of dictionary: 402653464
$ python2.7 pyspeed.py
time= 7.26046490669
size of dictionary: 402653464

现在,当我尝试在 Python3.1 中运行它时,它当然不起作用,因为 xrange 已被贬值。我读过的所有文档都说 range 现在可以像 xrange 一样工作。所以这是重写的程序:

import time,sys

count = 10 * 1000 * 1000
t1 = time.time()

d = dict()
for i in range(0,count):
    d[i] = i
for i in range(0,count):
    d[i] = d[i]*i
for i in range(0,count):
    d[i] = d[i]-i
t2 = time.time()

print("time=%f" % (t2-t1))
print("size of dictionary: %d" % sys.getsizeof(d))

以及Python3.1的表现:

$ python3.1 pyspeed.py
time=7.869891
size of dictionary: 402653464
$ python3.1 pyspeed.py
time=7.849537
size of dictionary: 402653464
$ python3.1 pyspeed.py
time=7.879416
size of dictionary: 402653464

慢了 7%。

出于预感,我尝试在 Python2.7 下使用range 而不是xrange 运行程序,得到了几乎相同的结果:

$ python2.7 pyspeed.py
time=7.735200
size of dictionary: 402653464
$ python2.7 pyspeed.py
time=7.743711
size of dictionary: 402653464
$ python2.7 pyspeed.py
time=7.762192
size of dictionary: 402653464

仍然优于 Python3.1,但不如使用 xrange 的 2.7。

在我看来是这样的:

  1. Python3.1 依然显着 比 Python2 慢。为什么不是 快点?
  2. 尽管文档声称,range() 在 Python3 不能正常工作 xrange() 在 Python2 中做过(至少 性能方面),它的工作方式 range() 做到了。

我在这里遗漏了什么吗?或者是时候开始放弃 Python 了吗?

【问题讨论】:

  • 是的,是时候放弃 Python 了。是否有特定的承诺来提高使用已被破坏的范围进行循环的性能?这似乎是放弃语言的一个小理由,就像丢掉一个鞋子不喜欢你的女人一样。
  • 您应该使用 timeit 模块来对 Python 中的代码进行计时。
  • 微基准测试慢了 7%?为我哭泣一条河!
  • dis.dis() 输出的比较可能很有启发性(并且可能会导致您可以提交错误报告)。
  • 另外,这个基准是 1. 非常做作(甚至超过平均基准)和 2. 无论如何都是糟糕的代码(尝试{i: (i * i - i) for i in range(count)})。

标签: python performance python-3.x


【解决方案1】:

1。 性能,python 文档: '''3.0 泛化的最终结果是 Python 3.0 运行 pystone 基准测试的速度比 Python 2.5 慢 10% 左右。最可能的最大原因是删除了小整数的特殊情况。有改进的余地,但会在3.0发布后实现!'''

2. range 和 xrange 的主要区别在于第二个产生了一个生成器。并且 range 也产生了一个生成器,在 python 3.x 中......没有区别

【讨论】:

  • 这不是一个生成器,它是一个列表理解。在概念上密切相关,但在 Python 2.x IIRC 中给出了非常不同的结果(并且实现方式也不同/更有效)
  • 感谢您指出。我编辑了,但在此期间答案已被关闭...大声笑;)
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多