为什么这段代码在Python 3中更慢?
我刚写了这段代码,想知道为什么在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的主要目标是功能齐全和稳定性,而不是速度。