【问题标题】:Python Fast Input Output Using Buffer Competitive Programming使用缓冲区竞争编程的 Python 快速输入输出
【发布时间】:2012-04-25 07:44:27
【问题描述】:

我看到人们使用不同语言的缓冲区在 Online Judges 中进行快速输入/输出。例如,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做到这一点?

【问题讨论】:

    标签: python performance io


    【解决方案1】:
    import sys
    file = sys.stdin
    size = 50000
    t = 0
    while(t != 0)
        block_read = file.read(size)
        ...
    ...
    

    这很可能不会提高性能——Python 是解释型语言,因此您基本上希望在本机代码(本例中为标准库输入/解析例程)上花费尽可能多的时间。

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

    【讨论】:

    • 第三方库不能在在线评委中使用。不过,谢谢。
    【解决方案2】:

    我尝试在 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
    

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2012-04-02
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多