与Python2相比,Python3中的代码相同

时间:2013-02-16 14:03:24

标签: python performance python-2.7 python-3.x

我编码this problem at CodeChef并将其作为Python3解决方案提交:

import sys

n,k = map(int,sys.stdin.readline().split(" "))
nos = map(int,sys.stdin.readlines())
ans = 0
for i in nos:
    if i>0 and i%k == 0:
        ans += 1
print(ans) 

但是,如果我把代码编写为:

,它会超出时间限制,令我感到恐惧
import sys

n,k = map(int,sys.stdin.readline().split(" "))
nos = map(int,sys.stdin.readlines())
ans = 0
for i in nos:
    if i>0 and i%k == 0:
        ans += 1
print ans 

并将其作为Python2解决方案提交,然后解决方案被接受。

我根本不明白这是怎么回事?...

==== ###更新### ====

Sebastian 的解决方案适用于Python3,但与我的python2.7解决方案相比, 10秒慢。我仍然没有得到答案,为什么与以前的语言相比,最新版本的语言会导致性能下降?...

3 个答案:

答案 0 :(得分:2)

我可以确认完全相同的解决方案通过python 2.7上的测试,但它在python 3.1上超时:

import sys
try:
    from future_builtins import map # enable lazy map on Python 2.7
except ImportError:
    pass 

file = sys.stdin
n, k = map(int, next(file).split())
print(sum(1 for i in map(int, file) if i % k == 0))

file是一个遍历行的迭代器。由于map是惰性的,代码支持大文件(不会立即使用整个文件)。

以下代码在python 3.1上传递测试:

import sys
n, k, *numbers = map(int, sys.stdin.buffer.read().split())
print(sum(1 for i in numbers if i % k == 0))

注意:它不支持任意大输入(以及问题中的代码)。

答案 1 :(得分:0)

在python3中,mapzip之类的东西会返回生成器而不是列表。我认为生成器带来了使代码TLE的开销。要制作一个真实的列表,请使用list comprehension [int(line) for line in std.sys]

答案 2 :(得分:0)

错误发生在n,k = map(int,sys.stdin.readline().split(" "))行。我试图将nk分开,但是一旦调用map命令,它似乎仍然会卡住。这是一个解释map函数的页面:http://docs.python.org/2/library/functions.html#map我或IDLE都找不到的语法似乎很奇怪。希望这有帮助