同样的代码在Python3中比Python2慢

5 投票
3 回答
1833 浏览
提问于 2025-04-17 16:06

我在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中,像 mapzip 这些函数返回的是生成器,而不是列表。我觉得生成器会带来一些额外的开销,这可能会导致你的代码超时。要想得到真正的列表,可以使用列表推导式,比如 [int(line) for line in std.sys]

0

这个错误出现在这一行:n,k = map(int,sys.stdin.readline().split(" "))。我试着把nk分开,但每次调用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))

注意:它不支持任意大的输入(和你问题中的代码一样)。

撰写回答