同样的代码在Python3中比Python2慢
我在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
在Python3中,像 map
和 zip
这些函数返回的是生成器,而不是列表。我觉得生成器会带来一些额外的开销,这可能会导致你的代码超时。要想得到真正的列表,可以使用列表推导式,比如 [int(line) for line in std.sys]
。
0
这个错误出现在这一行:n,k = map(int,sys.stdin.readline().split(" "))
。我试着把n
和k
分开,但每次调用map
命令时,它似乎就卡住了。这里有一篇关于map
函数的解释页面:http://docs.python.org/2/library/functions.html#map。我和IDLE都找不到语法上有什么奇怪的地方。希望这能帮到你。
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))
注意:它不支持任意大的输入(和你问题中的代码一样)。