免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gongyonghui2
打印 上一主题 下一主题

perl 如何高效统计01字符串(二进制串)中1的个数? [复制链接]

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
11 [报告]
发表于 2013-04-10 11:51 |只看该作者
回复 10# sammyjeep

different data and get different result

# time perl -le '$_="010000" x 10000000;$sCnt++ while(/1/g);print $sCnt'
10000000
real    0m1.994s

# time perl -le '$_="010000" x 10000000;s/0//g;print length'
10000000

real    0m20.301s

# time perl -le '$_="101111" x 10000000;$sCnt++ while(/1/g);print $sCnt'
50000000

real    0m9.172s

# time perl -le '$_="101111" x 10000000;s/0//g;print length'
50000000

real    0m4.382s

论坛徽章:
0
12 [报告]
发表于 2013-04-10 12:54 |只看该作者
回复 5# wenhq

可能比正则的效率稍微高点

  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;

  4. $_="010111"x1000000;
  5. my $count=0;
  6. while($_)
  7. {
  8.     $count++ if chop;
  9. }
  10. print $count;

复制代码
##################
real    0m0.576s
user    0m0.480s
sys     0m0.010s

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
13 [报告]
发表于 2013-04-10 14:30 |只看该作者
  1. time perl -le '$_="010111" x 1000000;@list=split /0/,$_;$len=scalar @list;print $len'
复制代码
real        0m1.279s

论坛徽章:
0
14 [报告]
发表于 2013-04-10 16:35 |只看该作者
  1. use 5.014;

  2. use Benchmark qw(timethese);

  3. timethese(100000, {
  4.     'tr' => sub {
  5.       my $str = "10101010101010";
  6.       my $times = $str=~ tr/1/0/;
  7.       return $times;
  8.     },
  9.     'replace' => sub {
  10.       my $str = "10101010101010";
  11.       my $times = $str =~ s/1/0/g;
  12.       return $times;
  13.     },
  14.   }
  15. );
复制代码
  1. Benchmark: timing 1000000 iterations of replace, tr...
  2.    replace: 10 wallclock secs (10.90 usr +  0.00 sys = 10.90 CPU) @ 91776.80/s (n=1000000)
  3.         tr:  1 wallclock secs ( 1.13 usr +  0.00 sys =  1.13 CPU) @ 883392.23/s (n=1000000)
复制代码

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
15 [报告]
发表于 2013-04-10 16:57 |只看该作者
回复 7# jason680


    多谢校正

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
16 [报告]
发表于 2013-04-10 17:00 |只看该作者
回复 14# Perlvim


    多谢采用你的建议了

论坛徽章:
0
17 [报告]
发表于 2013-04-10 17:09 |只看该作者
  1. $_= "01010101011101";
  2. print unpack("%B*", pack("B*", $_)), "\n";
复制代码

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
18 [报告]
发表于 2013-04-10 19:34 |只看该作者
回复 13# 不能超过15字


    以0 split的是不对的,如01111001产生的元素为('',1111,1),那么长度为三。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
19 [报告]
发表于 2013-04-10 22:33 |只看该作者
回复 18# gongyonghui2
恩,是呢。。谢谢//学习了。。。


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
20 [报告]
发表于 2013-04-11 08:08 |只看该作者
  1. perl -le '$_="010111" x 1000000;tr/0//d;print length'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP