在Python 2.7中有哪些更快的io的其他选项

时间:2013-06-10 11:47:25

标签: python performance python-2.7

我一直在codechef.com上遇到this练习问题。我终于能够找到一个有效的解决方案。

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中,如here所示。它比最好的解决方案更糟糕。他们都使用psyco模块,它不适用于Python 2.7。

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

编辑:

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

EDIT2:

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()

2 个答案:

答案 0 :(得分: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)相比更快。

答案 1 :(得分:1)

使用pypy,pysco的继任者。