Python和Ruby循环语句的效率问题


我可无意贬低Python和Ruby的性能,我也不想在这讨论语言性能这个问题。所以提刀拎砖进来的各路神仙请息怒,我只是无意之中碰到这这个可能是很多初学者都会碰到的问题。对于初学者,应该以理性的说服教育为主,胡砍乱拍是不对滴。

这两天考虑基于Bellman-Ford尝试实现我的想法。昨天睡觉之前完成了Python的实现,可是程序跑起来之后居然就像死了一样。我跟进去发现,慢的地方就在Bellman-Ford的那个嵌套循环的地方。然而实际上,我的输入规模并没有大的那么恐怖,有16108个顶点和10310条边,也就是一个16108×10310的循环而已,所以应该不至于把程序拖死吧。于是我做了下面的实验,分别在c#、Python和Ruby中进行了测试。代码如下,非常简单:

1. C#

1usingSystem;
2
3publicclassApp
4{
5publicstaticvoidMain()
6{
7intcounter=0;
8for(inti=0;i<16108;i++)
9for(intj=0;j<10310;j++)
10counter++;
11Console.WriteLine("Counteris:{0}",counter);
12}

13}

2. Python

1counter=0
2foriinrange(16108):
3forjinrange(10310):
4counter=counter+1
5
6print"Counteris:"+str(counter)


3. Ruby (没有Ruby的代码模板,用Python的凑合了)

1counter=0
2foriin0..16107
3forjin0..10309
4counter+=1
5end
6end
7putscounter

粗略测试运行时间结果为:

C#:不到1秒

Python:45秒左右

Ruby:1分33秒左右

这个结果让我很吃惊,于是又在同事ArcGIS里面用VBA试了一下,结果是不到2秒循环结束。这种嵌套循环应该在平时的代码中非常常见啊,为什么Python和Ruby会慢的这么离谱?是我的代码哪里写的有问题吗?在CSDN上发了一帖,结果有一位“双星”回复说:“是慢,没办法。尽量别写这样的代码是了。需要速度的时候用C或者C++写扩展吧。”OMG...我不会才用Python一个月就遇到这种语言本身的致命缺陷吧...对我将来“以脚本语言为主,编译语言为辅”的战略规划打击太大了吧...

p.s.不好意思的顺便也把Ruby也给连累了...

优质内容筛选与推荐>>
1、PHP自定义网站根目录
2、Mac OSX 下的QQ截图
3、布线问题
4、AssetBundle系列——游戏资源打包(一)
5、Nullable Value Type


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn