使用缓冲竞争编程的Python快速输入输出

时间:2012-04-25 07:44:28

标签: python performance io

我见过人们使用不同语言的缓冲区来实现在线评判中的快速输入/输出。例如,http://www.spoj.pl/problems/INTEST/用C完成,如下所示:

#include <stdio.h>
#define size 50000

int main (void){
unsigned int n=0,k,t;
char buff[size];
unsigned int divisible=0;
int block_read=0;
int j;
t=0;
scanf("%lu %lu\n",&t,&k);

while(t){
    block_read =fread(buff,1,size,stdin);
    for(j=0;j<block_read;j++){
        if(buff[j]=='\n'){
            t--;
            if(n%k==0){
                divisible++;
            }
            n=0;
        }
        else{
            n = n*10 + (buff[j] - '0');
        }
    }
}

printf("%d",divisible);
return 0;

如何用python完成?

2 个答案:

答案 0 :(得分:1)

import sys
file = sys.stdin
size = 50000
t = 0
while(t != 0)
    block_read = file.read(size)
    ...
...

尽管这很可能不会提高性能 - 但Python是解释语言,因此您基本上希望尽可能多地花费本机代码(在这种情况下为标准库输入/解析例程)。

TL; DR要么使用内置例程来解析整数,要么获得某种针对速度优化的第三方库。

答案 1 :(得分:0)

我尝试在Python 3中解决这个问题,无论我如何尝试阅读输入,都无法使其工作。然后我转而在Python 2.5下运行它,所以我可以使用

import psyco
psyco.full()

在进行了更改之后,我只需在for循环中一次只读取一行sys.stdin的输入就可以使其工作。我使用raw_input()读取了第一行并解析了nk的值,然后使用以下循环来读取输入的其余部分。

for line in sys.stdin:
    count += not int(line) % k