各种读入方式速度比较

以前写过一篇比较scanf与cin的博客,但是那篇博客存在很多bug,测速也很不规范。

今天我收集了一下众大佬的读入优化,来做个比较

特别鸣谢:my,zyh,hzwer,lyq

 

首先看一下各位大佬的读入优化

my(这是个超级大蒟蒻)

这是我自己yy着写出来的,虽然长得丑,但是也不快

1 inline void read(int &n)
2 {
3     char c=getchar();bool flag=0;n=0;
4     while(c<'0'||c>'9')    c=='-'?flag=1,c=getchar():c=getchar();
5     while(c>='0'&&c<='9')    n=n*10+c-48,c=getchar();flag==1?n=-n:n=n;
6 }

zyh:

1 inline void read(int &x)
2 {
3     char ch=getchar();x=0;int f=1;
4     for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
5     for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';x=x*f;
6 }

学姐的读入优化写法应该是介于我和hzwer之间的,而且用了isdigit黑科技

hzwer

1 inline int read()
2 {
3     int x=0,f=1;char c=getchar();
4     while(c<'0'||c>'9')    {if(c=='-')    f=-1;c=getchar();}
5     while(c>='0'&&c<='9')    x=x*10+c-48,c=getchar();    return x*f;
6 }

AG爷的读入优化,不知道速度怎么样

cin

cin+ios优化

scanf

(我仨是来打酱油的)

fread

 1 inline char nc(){
 2     static char buf[100000],*p1=buf,*p2=buf;
 3     return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
 4 }
 5 inline int read()
 6 {
 7     char ch=nc();int sum=0;int flag=1;
 8     while(!(ch>='0'&&ch<='9')){ch=nc();if(ch=='-')flag=-1;}
 9     while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
10     return sum*flag;
11 }

全网公认最强的IO优化写法

评测环境

就是机房里的电脑

评测方式

随机生成一组数据

测试不同的读入方式对相同的数据的读入速度

一种方式测试3-4次

单位:S

测试1:对于le6的int随机数据读入

cin1.7161.7111.8231.705
cin+ios0.45760.3460.34710.3461
scanf

0.4189

0.36690.37140.3761
my0.17620.14990.14930.1508
zyh0.2170.15050.15040.1533
hzwer

0.1626

0.15190.13570.1348
fread0.23880.12290.12570.1228

 

 

 

 

 

 

 

 

 

不难看出,对于1e6的数据读入差距已经非常明显了

 

测试2:对于1e7的int随机数据读入

cin17.0116.9317.13
cin+ios3.443.4133.416
scanf

3.606

3.5833.575
my 1.478 1.4191.418
zyh1.421.4241.423
hzwer

1.372

1.2581.26
fread1.1611.141.14

 

 

 

 

 

 

 

 

 

 

唔。。。和上面的排名基本类似

 

测试3:对于1e6的long long 随机数据读入

cin1.6491.6481.647
cin+ios0.42870.38680.3863
scanf

0.4644

0.3860.3819
my0.15250.14890.1499
zyh0.15630.15880.1554
hzwer

0.1548

0.13880.1395
fread0.13780.11990.1253

 

 

 

 

 

 

 

 

 

 

排名并没有发生多大变化...

总结

通过上面三组测试,各种读入方式的快慢已经比较清晰了

如果按照评分的话大概可以总结为

cin<cinios≈scanf<my≈zyh<hzwer<fread

 

转载于:https://www.cnblogs.com/zwfymqz/p/7707841.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于大文件的比对,可以通过以下几个方法提高比对速度: 1. 使用生成器或迭代器:将文件的比对过程改为使用生成器或迭代器,这样可以避免一次性将整个文件读入内存中,从而降低程序的内存消耗。例如,可以使用`readline()`方法逐行读取文件。 2. 使用多线程或多进程:将文件的比对过程分成多个子任务,使用多线程或多进程并发执行,可以提高比对速度。例如,可以使用`concurrent.futures`模块的`ThreadPoolExecutor`或`ProcessPoolExecutor`来实现多线程或多进程。 3. 使用哈希表:将文件A中的所有行保存到哈希表中,然后遍历文件B的每一行,在哈希表中查找是否存在该行,可以大大提高比对速度。例如,可以使用Python内置的`set`类型实现哈希表。 4. 使用排序算法:将文件A和B中的所有行分别排序,然后使用归并排序算法将两个有序列表合并,可以快速找到不同的行。这种方法的时间复杂度为O(nlogn),比哈希表更适用于大文件的比对。 这里提供一种使用哈希表的实现方式,具体代码如下: ```python with open('A.txt', 'r') as fileA, open('B.txt', 'r') as fileB, open('C.txt', 'w') as fileC: # 读取文件A的所有行,并将其保存到哈希表中 linesA = set(fileA.readlines()) # 遍历文件B的每一行 for lineB in fileB: # 如果该行不在哈希表中,则将该行写入文件C中 if lineB not in linesA: fileC.write(lineB) ``` 该方法的时间复杂度为O(n),只需要遍历文件B一次,比暴力比对的时间复杂度O(n^2)要快很多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值