`
xukong
  • 浏览: 34262 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

从实际工作需要与经历说说我选择PYTHON的原因(附相关源代码)

阅读更多
    从实际工作经历中说说我选择python的原因

    这两天看到有人问为什么好多大公司为什么选择PYTHON,大公司有大公司的考虑,这里只是说说我从实际工作中碰到问题解决后的选择.
   
    呵,呵,我是蛮羡慕RUBY有个很流行的WEB开发框架,也挺有兴趣学习,WEB敏捷开发之道的一二版和programing ruby第2版也买了,可惜因为在的公司进行的都是企业开发,基本上都用JAVA,不能实际应用RAILS,那就当个人兴趣爱好学习了.

    去年有次我负责的一个项目需要处理几个文本文件出话单和联通对帐,每个话单文件的处理条数大概是150到200万条,那时候对ruby也有些了解了,脚本语言上手还是挺快的,就用RUBY写了个小程序,花了天把完成任务,记不清当时为什么又用PYTHON来写了个程序来比较,可能是因为这两个脚本语言都比较有名,想多了解比较下的原因吧.

    这个程序牵涉到的就是字符串比较和文件读写.(惭愧惭愧,处理时间有差距,但没有我以前说的那么巨大,因为我写的RUBY代码不够高效,有同学改进后的代码提升到3倍以内,详见后帖)
  
    跑程序的机子是台IBM的X60,使用的CPU是T5600,1.8G的,内存是2G,硬盘100G,操作系统是 XP+sp3 , ruby 是一键安装的 1.8.6 吧(今天装的是 1.8.6-27) , python 当时是 2.5.2 今天我用的是(2.6.2),因为准备写这篇帖子,原来的话单文件又比较大,上百M和牵涉到手机号码,就写了个python程序,来生成测试用的话单.

    我当时是先写了RUBY,然后按RUBY的写法,又再写了个PYTHON,代码几乎都是一模一样的,也没有考虑什么优化啊编程技巧啊这些,数据需要怎么处理,就用语言提供的数据类型和进行最基本的操作,反正只是个小程序,用了就完了,而且写个脚本程序都要搞很高深的编程技巧,优化技巧,这不就有些为难不是专业人士,就想用脚本程序解决下问题的人了吗?

    今天的测试结果:
    测试120万条记录,PYTHON跑了40多秒.
    200万记录的测试,python跑了55秒.

    我平时工作中会经常需要写小程序解决问题,经常牵涉到全省手机号码的处理,一处理就是几十上百万的记录条数,你要说RUBY慢到我不能忍受的地步,也不至于,不过毕竟都喜欢跑得快的程序不是,而且ruby最吸引我的WEB开发,因为工作关系,不能轻易用,平时还是写些小程序处理网络,处理文件用得多些.   

    所以我最后还是选择了PYTHON,web开发因为工作原因还是用JAVA.

    程序代码就贴在下面,压缩包里是所有的相关源文件
   
    执行 MakeTestData.py 指定数字 生成指定数字条数的话单,比如 MakeTestDagta.py 1200000 就生成120万条数据,里面的数据没有任何意义,就是为了达到测试量的数据而已,为了方便,发送和接收数据都设置为指定数据的一半.

    然后执行 RunPyTest.bat 或 RunRbTest.bat 进行相关的运行测试,运行完后报告运行时间.
   
    我是希望有人能指点为什么我写的ruby程序比python慢了挺多的,不说又会换回ruby,长长经验也是个好事情嘛...

    我刚才又测试了一下,100万条数据,环境如上,跑了10次,结果还是一样,100万条数据的测试结果python 27,要说明下大部分ruby的时间是花在了写结果文件上,看来是IO读写拖了后腿,内存之中的运行应该差不多?(有时间再比较下)不过我这个程序正好碰到了大量的文件读写,我的标题应该改下了,只是有一定的差距...

   去掉最后的文件写入,差异也是比较巨大的,PYTHON 10 秒, RUBY 80 秒..测试记录是100万条(去掉最后的文件写入后的代码比较简单,还是有这个差异,要继续寻找答案,呵...)

    好象也不算是拖后腿,ruby python 都是用了2/3的时间来写结果文件
   
    我注释掉rb中对format_data的调用,直接赋予'',rb后面的写文件就很快了,那就是字符串操作...?
   
   下面是python处理的代码:
    
     数据处理要求是这样的,分3大步:
     1.有一个等待发送状态报告文件来匹配数据的文件,里面包含得有
     移动发往联通
     wait-status.csv 中第一个字段为3
     和
     联通发往移动
     wait-status.csv 中第一个字段为4
     的所有记录
     首先读取等待状态报告文件中的数据到哈希表中去,根据第一个字段为3或者4取不同的字段作为key放入到2个不同的(发送和接收)哈希表中
    
     2.然后读取状态报告文件 status.csv 的每一行,根据第一个字段作为KEY尝试去取2个哈希表中的数据,
     取得到数据就根据是从哪个哈希表中取出的分别放到2个不同的数组(发送和接收)中去
      取不到就丢弃

     3.然后把这2个不同的数组中的每条数据转换组合后写到文件中(发送GMO,接收GMT)去就OK了
   

分享到:
评论
107 楼 hurd 2009-06-14  
用了1个小时,写了个D语言版的。
对D了解少,后来花了2~3个小时提升性能。

应该还有很大的优化余地。。。

http://testd.googlecode.com/files/Lost.zip
106 楼 lfx_cool 2009-06-04  
居然讨论到“八字不合”上来,不过我喜欢这个观点,看来大家学习的时候不能光看哪个东西用处大或者性能好,还得算算八字
105 楼 ipconfiger 2009-05-20  
确实有的时候感觉和一些语言“八字不合”,比如我就对pascal的写法及其不适应,可能和人大脑潜意思区的习惯有关系
104 楼 白发红颜 2009-05-12  
Ruby我看起来一头雾水, Python我用起来觉得极具表达力, 怎么想就怎么写, 如臂使指.
说明我与Ruby八字不合...
103 楼 zwws 2009-05-12  
schweigen 写道
同意楼主的部分观点,我也曾同时用python 和ruby 写过约一万个文本2G 的内容的处理脚本。首先,这个脚本用完了就基本不会再用了,属于一次性的东西,所以我也不会花太多精力在调优上。处理结果是Python 花了大概5分钟多点,Ruby 过了半小时被我Ctrl+C 了。
当然,Ruby 不会和Python 差这么多,但是这从一个方面证明,python 用来随手写点小工具,是比ruby 强一些,python 在文本处理上面也比ruby 强


看下来觉得没有讨论出什么实际意义出来,只是涉及到两派爱好者的观点问题。

我赞同“python 用来随手写点小工具,是比ruby 强一些,python 在文本处理上面也比ruby 强”
102 楼 schweigen 2009-05-12  
同意楼主的部分观点,我也曾同时用python 和ruby 写过约一万个文本2G 的内容的处理脚本。首先,这个脚本用完了就基本不会再用了,属于一次性的东西,所以我也不会花太多精力在调优上。处理结果是Python 花了大概5分钟多点,Ruby 过了半小时被我Ctrl+C 了。
当然,Ruby 不会和Python 差这么多,但是这从一个方面证明,python 用来随手写点小工具,是比ruby 强一些,python 在文本处理上面也比ruby 强
101 楼 yehq 2009-05-11  
仔细看了一下楼主的程序,自己也做了一下测试(前提是保证正确性,和楼主的程序运行结果对比),说说我的看法:

从性能上来说,我觉得楼主的程序有两个问题:
1. 读wait-status.csv文件时没必要分成两个map,一个就够了,在读status.csv文件时再去判断3和4,这样的好处是只要查找一次map;如果保存在两个map中,有可能会查找两次map。虽然两个map每个都比一个map小,但是查一次总的来说比两次要快,实际的测试结果也证明了这一点。
2. 应该在读 status.csv 这个文件的同时写GMO和GMT文件,没有必要保存到数组里在写文件。当然根据我测试的结果,这个对性能影响不明显,但是这样很浪费内存是肯定的。

另外楼主也一直强调可读性,但是我觉得format_data有点过于“临时性”了。前半部分楼主是在分析“2008-8-10 0:00:00.140”这个日期吧,arrdata[10:12]这样直接取字符串效率可能是最好的,但是不知道2008-1-1, 2008-1-10,2008-10-10这些格式楼主是不是都考虑到了,我觉得对于2008-1-1这种情况就是错的。我试过用split和正则表达式来分析,正则表达式确实比较慢一些,split还是可以接受的,虽然不如直接定位字符串快。field01,field02..., 可以换成列表,然后 return "\t".join(fields) 我觉得更合适一些吧,我测试的结果是稍慢于不使用列表的方式,但是影响不大。至少用列表的一个好处是,可以用append函数,不必担心写错其中一个变量的序号,以后修改也不用重新编号。

一点个人想法,ruby我没用过,不发表意见。

如果只是解决一个小问题,确实不必这么大费周章。但是我不太同意楼主所说“写个脚本程序都要搞很高深的编程技巧,优化技巧,这不就有些为难不是专业人士,就想用脚本程序解决下问题的人了吗? ”这样的说法。非专业有非专业的用法,专业有专业的用法。其实大部分的日常工作都是琐碎的,不是那么有创造性的,脚本语言正是提高这些琐碎工作的很好的工具。而且实际上现代脚本语言已经非常成熟了,能够解决我们日常工作中的大部分的实际问题,用脚本语言为基础结合其他语言(比如用C/C++写核心)来实现大型系统的例子也不少。为了下一次更好的解决问题,适当的研究一下还是有必要的。当然钻牛角尖也没必要,自己觉得合适并且够用就好了。

一点废话,楼主看看就好,不用当真,呵呵。
100 楼 neomac.lin 2009-05-10  
sdem 写道
neomac.lin 写道
了解,看来有时候可读性和具体需求真是鱼与熊掌啊,学习了。


那么,如果读不出具体需求,可读什么?

可读,是指可读出基本逻辑,维护人员可以在短时间内了解,具体要求,指其对运行速度或相关运行平台等的具体要求。
本来python和ruby都是所谓quick and dirty的脚本语言,目的是短时间内建立逻辑模型,并进行验证其逻辑合理性。至于平台优化,速度优化等,不是这些语言的特长。c++和c#都可以开发3D游戏,两者都可以有效表述其中的算法,甚至c#可能更容易阅读。但执行速度,c++是当仁不让了。
楼主如果要强调他的逻辑严紧和运行速度要求,却使用弱类型和非编译型的脚本语言,这一点就会很奇怪,
如果非要说,楼主和各位在比较两个脚本语言的优点,运行速度并不是这些语言的长处,比较长处应该是谁能在更短的时间内更快地建模。
我列举的code中,LZ指出的错误,是我已知范围外的需求,就必须是数组中除了第一位,还可能在数组中有其它独立的3或4,还有说运行速度,在原文中,我连需求都没看见。可是在相对短的时间和代码中,同样的基本逻辑却是描述清楚了。
99 楼 sdem 2009-05-09  
neomac.lin 写道
了解,看来有时候可读性和具体需求真是鱼与熊掌啊,学习了。


那么,如果读不出具体需求,可读什么?
98 楼 neomac.lin 2009-05-08  
xukong 写道
neomac.lin 写道
LZ,抛开ruby不谈,以下python代码是否符合原来的逻辑呢?

print "正在读取等待状态报告的记录..."

with open(waitstatusfile) as f:
    for line in f:
        if (len(line) < 23):
            continue
        arrline = line.split(",")
        if "3" in arrline:
            fwdsendwaitstatus[arrline[1].strip('\r\n')]=line
        if "4" in arrline:
            fwdrecvwaitstatus[arrline[6].strip('\r\n')]=line

print "开始状态报告的比较与分类..."


with open(statusdatafile) as f:
    for line in f:
        if (len(line) < 23):
            continue
       
        arrline = line.split(",")
        key = arrline[0].strip('\r\n')

        if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)):
            fwdsendresult.append("DELIVRD" + "," + fwdsendwaitstatus[key])
            del fwdsendwaitstatus[key]
        if ( (key in fwdrecvwaitstatus.keys()) & ("DELIVRD" in arrline)):
            fwdrecvresult.append("DELIVRD" + "," + fwdrecvwaitstatus[key])
            del fwdrecvwaitstatus[key]
      
print "结束状态报告的比较与分类"



  本来不想就这些其他看法再进行讨论说明了,因为讨论这些不是我发这个帖子的本意,不过先说几句,晚些有空再来进行个最后总结,谢谢大家的参与了

首先
        if "3" in arrline:
这句是有问题的,因为我要判断的是第一个字段,也就是arrline列表的第一个是3才行,然而你的这行代码是只要其中有个元素等于3就可以了,虽然模拟数据中没有出现其他字段会有3了,执行正确,但你这行代码起码逻辑是不够完善的,没有严格根据需要完成对数据的判断

然后
        if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)):
每行文件数据的处理中都执行这句代码在操作大数据量哈希表时是有非常大的性能问题的,而且还执行了2次,不知道你执行过没有,虽然看出你的问题了,但我还是实际执行过,确认确实很有性能问题才发上来指出的,希望指明后你能看出来,呵...

了解,看来有时候可读性和具体需求真是鱼与熊掌啊,学习了。
97 楼 dreaminjava 2009-05-08  
..................
96 楼 xukong 2009-05-08  
neomac.lin 写道
LZ,抛开ruby不谈,以下python代码是否符合原来的逻辑呢?

print "正在读取等待状态报告的记录..."

with open(waitstatusfile) as f:
    for line in f:
        if (len(line) < 23):
            continue
        arrline = line.split(",")
        if "3" in arrline:
            fwdsendwaitstatus[arrline[1].strip('\r\n')]=line
        if "4" in arrline:
            fwdrecvwaitstatus[arrline[6].strip('\r\n')]=line

print "开始状态报告的比较与分类..."


with open(statusdatafile) as f:
    for line in f:
        if (len(line) < 23):
            continue
       
        arrline = line.split(",")
        key = arrline[0].strip('\r\n')

        if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)):
            fwdsendresult.append("DELIVRD" + "," + fwdsendwaitstatus[key])
            del fwdsendwaitstatus[key]
        if ( (key in fwdrecvwaitstatus.keys()) & ("DELIVRD" in arrline)):
            fwdrecvresult.append("DELIVRD" + "," + fwdrecvwaitstatus[key])
            del fwdrecvwaitstatus[key]
      
print "结束状态报告的比较与分类"



  本来不想就这些其他看法再进行讨论说明了,因为讨论这些不是我发这个帖子的本意,不过先说几句,晚些有空再来进行个最后总结,谢谢大家的参与了

首先
        if "3" in arrline:
这句是有问题的,因为我要判断的是第一个字段,也就是arrline列表的第一个是3才行,然而你的这行代码是只要其中有个元素等于3就可以了,虽然模拟数据中没有出现其他字段会有3了,执行正确,但你这行代码起码逻辑是不够完善的,没有严格根据需要完成对数据的判断

然后
        if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)):
每行文件数据的处理中都执行这句代码在操作大数据量哈希表时是有非常大的性能问题的,而且还执行了2次,不知道你执行过没有,虽然看出你的问题了,但我还是实际执行过,确认确实很有性能问题才发上来指出的,希望指明后你能看出来,呵...
95 楼 neomac.lin 2009-05-08  
LZ,抛开ruby不谈,以下python代码是否符合原来的逻辑呢?

print "正在读取等待状态报告的记录..."

with open(waitstatusfile) as f:
    for line in f:
        if (len(line) < 23):
            continue
        arrline = line.split(",")
        if "3" in arrline:
            fwdsendwaitstatus[arrline[1].strip('\r\n')]=line
        if "4" in arrline:
            fwdrecvwaitstatus[arrline[6].strip('\r\n')]=line

print "开始状态报告的比较与分类..."


with open(statusdatafile) as f:
    for line in f:
        if (len(line) < 23):
            continue
       
        arrline = line.split(",")
        key = arrline[0].strip('\r\n')

        if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)):
            fwdsendresult.append("DELIVRD" + "," + fwdsendwaitstatus[key])
            del fwdsendwaitstatus[key]
        if ( (key in fwdrecvwaitstatus.keys()) & ("DELIVRD" in arrline)):
            fwdrecvresult.append("DELIVRD" + "," + fwdrecvwaitstatus[key])
            del fwdrecvwaitstatus[key]
      
print "结束状态报告的比较与分类"
94 楼 wosmvp 2009-05-07  
cx6445 写道

把c都拿出来了比了,再下去拿汇编拿机器码优化了。楼主只是表达同样是python和ruby的初学者,python写的程序相对快些。


,我想表述的是 做“不同的事情”有“不同的最佳工具” ……
93 楼 cx6445 2009-05-07  
wosmvp 写道
[quote=&quot;conservatism&quot;]
lz的代码比较乱,不过我以前也对比过,比lz的场景简单:

[code=&quot;python&quot;]input = open(&quot;in.txt&quot;,&quot;r&quot;)
output = open(&quot;out&quot;,&quot;w&quot;)
line = input.readline()
while line:
  info=line.split(&quot;:&quot;)
  output.write(info[1]+&quot;\t&quot;+info[2]+&quot;\n&quot;)
  line = input.readline()
input.close()
output.close()


[code=&quot;ruby&quot;]input = open(&quot;in.txt&quot;,&quot;r&quot;)
output = open(&quot;out.txt&quot;,&quot;w&quot;)
while line = input.gets
info=line.split(/:/)
output.write(info[1]+&quot;\t&quot;+info[2]+&quot;\n&quot;)
end
input.close
output.close
处理了一个6G的话单,最后Python大概5分钟,Ruby半个小时。



其实您这个代码还是可以优化的……

用sed试试,花多长时间?

sed -i 's/:/\t/' 文件名



把c都拿出来了比了,再下去拿汇编拿机器码优化了。楼主只是表达同样是python和ruby的初学者,python写的程序相对快些。
92 楼 wosmvp 2009-05-06  
[quote=&quot;conservatism&quot;]
lz的代码比较乱,不过我以前也对比过,比lz的场景简单:

[code=&quot;python&quot;]input = open(&quot;in.txt&quot;,&quot;r&quot;)
output = open(&quot;out&quot;,&quot;w&quot;)
line = input.readline()
while line:
  info=line.split(&quot;:&quot;)
  output.write(info[1]+&quot;\t&quot;+info[2]+&quot;\n&quot;)
  line = input.readline()
input.close()
output.close()


[code=&quot;ruby&quot;]input = open(&quot;in.txt&quot;,&quot;r&quot;)
output = open(&quot;out.txt&quot;,&quot;w&quot;)
while line = input.gets
info=line.split(/:/)
output.write(info[1]+&quot;\t&quot;+info[2]+&quot;\n&quot;)
end
input.close
output.close
处理了一个6G的话单,最后Python大概5分钟,Ruby半个小时。



其实您这个代码还是可以优化的……

用sed试试,花多长时间?

sed -i 's/:/\t/' 文件名

91 楼 conservatism 2009-05-06  
<p>lz的代码比较乱,不过我以前也对比过,比lz的场景简单:</p>
<pre name="code" class="python">input = open("in.txt","r")
output = open("out","w")
line = input.readline()
while line:
  info=line.split(":")
  output.write(info[1]+"\t"+info[2]+"\n")
  line = input.readline()
input.close()
output.close()</pre>
<p> </p>
<p> </p>
<pre name="code" class="ruby">input = open("in.txt","r")
output = open("out.txt","w")
while line = input.gets
info=line.split(/:/)
output.write(info[1]+"\t"+info[2]+"\n")
end
input.close
output.close</pre>
<p> 处理了一个6G的话单,最后Python大概5分钟,Ruby半个小时。</p>
90 楼 cgwangjun 2009-05-06  
嗯!楼主肯专研比较值得敬佩!讨论妙处生花堪为精彩!精华贴!
89 楼 xukong 2009-05-06  
呵,谢谢这么多同学的参与,讨论到现在,我就用个不太恰当的比喻来总结一下:

在小学联谊运动会的百米跑比赛结束后,有好事同学就在一人多之处上发起讨论,

好事同学先发言: 大家都是在宽10米的一条直线跑道上比赛,大家都是用2条腿跨步跑,怎么甲A跑得比甲B快了那么多?

W同学说: 我觉得可能是主场问题,甲A是WIN校的,甲B是LINUX校的,比赛在WIN校进行,所以甲A有一定优势(操作系统原因)
好事同学: 有道理

W同学又说: 我觉得甲B同学的跑步姿势有问题,待我纠正一下,亲身演练一番,果然是快了许多(谢谢W同学的代码)
好事同学: 有道理

W同学又说: 我觉得甲A同学身上的衣服穿得厚了点,可能空气阻力有点影响,另外他跑得有点急,小步子太多了,其实它可以更快的
(变量多,语句多)
好事同学: 有道理,但看来不是主要原因

H同学说: 我来说一句,甲B同学的皮肤不够白,不够漂亮
好事同学: ...
88 楼 xukong 2009-05-05  
Xorcerer 写道
xukong 写道
呵, Xorcerer 的帖子我好多是有看没有懂...

不过我已经回答我看懂的了...

大家讨论的时候,特别是发帖人的不足会被一一指出,无一错漏,这很正常,反正大家也看到,也不存在狡辩,有理有据的,接受,或者公说公有理的,那就再论,呵,如果大家有闲有兴趣的话...


看Hooopo的就足够了。
我上一个回帖的话,只是希望你不要把习惯,性能,可读性揉在一起说。
别人说这样性能不好,你就说你习惯了,
别人说这是Ruby一般用户的习惯,你就说这样可读性不好,
别人说这样对于Ruby一般用户来说可读性较好,你却说这样性能有问题,
......
总有理由,却没有一个确定的立足点。

其他朋友已经直接或者间接地提到这个问题,我只是直白一点罢了。

比如,你说!不舒服,而你更倾向于Python,那么我就提到了,Python用的not,其实很直观;
而前面Hooopo也说了,object.nil?这个方法是Ruby的惯例(我开始也忘了);
至于Ruby是不是太无聊,居然用一个方法代替 object == nil,就是个编程哲学问题的,你高兴就好。
就如为什么Java不是Ruby这类的问题。

我也总是忘记str.empty?之类的方法,但我至少知道用它有利于其他Ruby用户的理解,至少知道我忘记这个不好。

可读性针对那个语言的一般用户的而言的,否则的话,就无所谓可读性了;
习惯是针对自己的。

请原谅我的直白,也请相信我没有恶意。


呃...看样子文字不大容易精确表示想表达的意思,写的是一个意思,看的可能又有不同的理解,我就多说几句解释下

Xorcerer 写道
别人说这样性能不好,你就说你习惯了,

确实,我的代码长了点,可能是会影响性能,但PY执行的结果我能接受,大量的数据能在5分钟内处理结束,工作很快完成了,我很高兴,再改进提高到3分钟,2分钟也没什么太大意义,请注意,是接受这次写出程序的运行结果,不是习惯...而且我前面说的习惯也只说习惯了变量名写得长些,操作步骤表达式写的详细些,导致代码有点冗长,竟然被引申到习惯性能不好,真是厉害...

Xorcerer 写道
Ruby一般用户的习惯,你就说这样可读性不好
别人说这样对于Ruby一般用户来说可读性较好,你却说这样性能有问题

!我是说了不舒服,但没说我倾向于py,只说了我习惯于 if (result_search == nil), 这是PY独有的?

性能问题我只是开个玩笑,意思是这句代码的写法不只是个人爱好问题,严格来讲,是有影响性能的地方的,

我确实很看不惯这个多出来的操作和不必要的非空反向思考,并不会因为PY是用NOT而改变,也不会因为这适合RUBY用户的习惯和可读性,而不说出我的看法.

RUBY用户的习惯和可读性我不会也没资格横加干涉,我只说出我写这样一条语句的理由和抉择...讨论的也就是有限的2条语句,这两条语句中我也只明确反对一条(认为可读性和性能都有问题),另一条随意,就被以点概面的引申到一般用户的习惯,一般用户的可读性,而且好象先说后说,我就不停的闪闪烁烁,呵...

Hooopo的2个疑问当时我回复了,解释了许多,现在才明白意思大概是写得不够RUBY,呵...

请原谅我不停的回复,我承认这几句话把我说得有点堵,呵...

object.nil? 这个我也只说了习惯普遍的写法,就让我被说不够RUBY吧

Xorcerer 写道
可读性针对那个语言的一般用户的而言的,否则的话,就无所谓可读性了;
呃...仔细想了想,这个见仁见智了

我前面提到的可读性的意思是看到这段rb代码跑得快,想学又没有接触过rb的人,可能会觉得要了解的东西比较多
不象都是用通用的普通语句写的,速度也够快的,容易接受而已

相关推荐

Global site tag (gtag.js) - Google Analytics