为什么这段代码在Python 3中更慢?

4 投票
2 回答
1047 浏览
提问于 2025-04-16 17:08

我刚写了这段代码,想知道为什么在Python 3中运行得特别慢?这种情况在所有平台上都是一样的吗?是我运气不好,还是说Python 3本身就比较慢呢?

谢谢!

性能:

       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)

2 个回答

1

我想我自己找到了答案:

简单来说,Python 3.0的改进导致它在运行pystone这个测试时,比Python 2.5慢了大约10%。最主要的原因可能是小整数的特殊处理被去掉了。虽然还有改进的空间,但这些改进会在3.0发布之后进行!

补充:虽然在OS X上性能下降了40%这点让人有些意外……

4

Python 3(也叫Py3k)通常比Python 2.x要< a href="https://stackoverflow.com/questions/2112298/python-2-x-vs-3-x-speed">慢。不过随着时间的推移,这种情况会有所改变。Python 3的主要目标是功能齐全和稳定性,而不是速度。

撰写回答