【问题标题】:Why is this code slower in Python 3?为什么此代码在 Python 3 中较慢?
【发布时间】:2011-05-06 17:40:30
【问题描述】:

我刚刚编写了这段代码,我想知道为什么它在 Python 3 中的表现要差得多?所有平台都一样吗?这只是运气不好,还是 Py3 通常比较慢?

谢谢!

性能:

       python 2.6  python 3.1  pypy 1.5
linux  2.2s        2.4s        0.8s
os x   2.5s        3.4s        0.7s

代码:(抱歉太仓促了,效率低下!)

import itertools
import random

def fptp_draw(result):
    votes = [prefs[0] for prefs in result]
    counts = [len([v for v in votes if v == c]) for c in [1, 2, 3]]
    s = sorted(counts)
    #print('fptp', counts)
    return s[-1] == s[-2]

def av_remove(prefs, cand):
    if prefs[0] != cand:
        return prefs
    else:
        return prefs[1:]

def av_draw(result):
    nv = len(result)
    cands = [1, 2, 3]
    while True:
        votes = [prefs[0] for prefs in result]
        counts = [len([v for v in votes if v == c]) for c in cands]
        #print('av  ', cands, counts)
        s = sorted(counts)

        if s[-1]*2 > nv:
            return False
        if len(cands) == 2:
            return True

        loser = cands[counts.index(s[0])]
        cands.remove(loser)

        result = [av_remove(prefs, loser) for prefs in result]

    return False

#orders = list(itertools.permutations([1, 2, 3]))
orders = [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

#results = list(itertools.product(*itertools.repeat(orders, 6)))
#results = random.sample(results, 5)

def rand_vote():
    return [random.choice(orders) for i in range(1000)]

n = fptp = av = 0
for j in range(1000):
    r = rand_vote()
    #print()
    #print(r)
    n += 1
    if fptp_draw(r):
        fptp += 1
    if av_draw(r):
        av += 1

print(fptp*100.0/n, av*100.0/n)
print(n)

【问题讨论】:

  • 您是否在不同的解释器上分析了代码?

标签: python performance python-3.x


【解决方案1】:

Py3k 通常是slower,而不是 python 2.x。这会随着时间的推移而改变,但 py3k 的重点是功能完整性和稳定性,而不是速度。

【讨论】:

  • 谢谢 - 我有点失望,这么大的打击,但我很高兴 PyPy 表现如此出色,只需要很小的改变。
【解决方案2】:

我想我已经回答了我自己的问题:

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

编辑:虽然令人惊讶的是它在 OS X 上的性能下降了 40%...

【讨论】:

  • 2 cmets。首先,40% 并不是那么大。其次,您假设您的代码的性能告诉您其他代码将如何执行。 (虽然我并不是说 3.1 并不比 2.6 慢。)
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2019-06-23
  • 2021-08-04
相关资源
最近更新 更多