1

我在 codechef.com 上一直在努力解决这个练习问题一段时间。我终于能够提出一个可行的解决方案。

import sys

def p():
    numbers, div = map(int,sys.stdin.readline().split())

    ans = 0
    for i in xrange(numbers):
        if int(sys.stdin.readline()) % div == 0:
            ans += 1
        i += 1

    print ans

p()

但这在 43.60 中执行,如此处所示。它比给定的最佳解决方案差得多。他们都在使用不适用于 Python 2.7 的 psyco 模块。

Python 2.7 中是否有一些更快的 IO 方法可以提高这个实践问题的时间效率以及需要大量输入的一般编程问题?还请考虑可能会增加内存使用以获得所需时间效率的情况。

编辑:

此问题不需要更快的浮点数 IO,但其他问题可能需要更快的 IO,因此也为他们提出一些建议。

编辑2:

nums = int(sys.stdin.readline())
float_nums = map(float,next(sys.stdin).split())
for p in islice(sys.stdin, float_nums, None):

我正在使用类似上面的东西与@Martijn Pieters 一起使用浮点数的答案。我没有使用xrange()

4

2 回答 2

4

将文件用作迭代器(不同的,可能更优化的缓冲区策略),并利用生成器表达式:

import sys
from itertools import islice

def p():
    numbers, div = map(int, next(sys.stdin).split())
    print sum(int(l) % div == 0 for l in islice(sys.stdin, numbers))    

p()

这将布尔值视为整数(它们是子类;True在整数上下文中为 1,False为 0)。

或尝试:

import sys
from itertools import islice

def p():
    numbers, div = map(int, next(sys.stdin).split())
    print sum(1 for l in islice(sys.stdin, numbers) if int(l) % div == 0)    

p()

它们所做的工作量不同,并且根据存在的可整除数字的数量,一个可能比另一个更快(if测试与求和 0 和 1)。

于 2013-06-10T11:53:41.037 回答
1

使用pypy,它是 pysco 的继承者。

于 2013-06-10T13:15:50.787 回答