为什么Python 3中的代码速度较慢?

时间:2011-05-06 17:40:31

标签: python performance python-3.x

我刚写了这段代码,我想知道为什么它在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)

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

  

3.0概括的最终结果是Python 3.0运行pystone基准测试比Python 2.5慢大约10%。最有可能的最大原因是为小整数移除了特殊套管。还有改进的余地,但会在3.0发布后发生!

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

相关问题