Почему этот код медленнее в Python 3? - PullRequest
4 голосов
/ 06 мая 2011

Я только что написал этот код, и мне было интересно, почему он работает значительно хуже в 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 ]

4 голосов
/ 06 мая 2011

Py3k обычно медленнее , чем Python 2.x.Это изменится с течением времени, но в центре внимания py3k была полнота и стабильность функций, а не скорость.

1 голос
/ 06 мая 2011

Кажется, я ответил на свой вопрос:

Чистый результат обобщений 3.0 состоит в том, что Python 3.0 выполняет тест Pystone примерно на 10% медленнее, чем Python 2.5. Скорее всего, самой большой причиной является удаление специального регистра для маленьких целых чисел. Есть возможности для улучшения, но это произойдет после выхода 3.0!

РЕДАКТИРОВАТЬ: хотя это удивительно, что это 40% -й удар по производительности на OS X ...

...