• 2012-08-11

    小心递归次数限制

    Views: 11736 | 3 Comments

    最近, 我在 review 组员的 Python 代码时, 发现了一个递归调用, 我立即发现了其中的问题.

    先说一下编程中递归. 只有会用递归, 并且能随心应手地写出递归程序的程序员, 才是已经入门了的程序员. 不过, 许多程序员并没有发现编程中的递归的一个限制: recursion depth limit, 逻辑上的递归可以无次数限制, 但语言执行器或者程序堆栈会限制递归的次数.

    例如一个 Cpy 编程语言(用 C 语法写 Python 代码)例子:

    function func(i){
        if(i < 1000000){
            try{
                func(i + 1);
            }catch(Exception e){
                print 'maximum recursion depth exceeded', i;
                print e;
                return;
            }
        }
    }
    
    func(1);
    

    因为 Python 语言有递归次数的限制, 试验结果是 997 次.

    sys.setrecursionlimit( limit) 
    

    而 C 语言的限制, 是程序堆栈的大小限制, 超过之后, 会产生 stack overflow. 比如下面这个 C 语言的例子在我的环境下只递归了 511 次:

    void func(int i){
        int buf[1000];
        if(i < 100000){
            printf("depth = %d\n", i);
            func(i + 1);
        }
    }
    
    int main(int argc, char **argv){
        func(1);
        return 0;
    }
    

    再回到最先开始提到的, 我 review 发现的例子, 我为什么能一眼就发现那个递归有问题呢. 因为, 那段代码是一段按行分析文本的程序, 当发现某一行不符合条件时, 程序会递归调用分析函数递归地分析下一行. 显然, 如果连续 997 行文本不符合条件, Python 程序就会崩溃退出了.

    Posted by ideawu at 2012-08-11 13:51:36 Tags:
  • 2012-07-24

    Cpy是如何打败Python的

    Views: 23873 | 48 Comments

    Python 语言的初学者, 特别是"惊奇者"(也就是那种第一眼就被毫无意义的某些特性吸引, 之后持续说服自己的人)认为 Python 不需要 C 语言的 for 语句, 因为他们能用优雅的 Python for 来代替类 C 的 for.

    Cpy 的循环方式:

    for(i=s; i<num; i+=step){
    }
    

    Python 的循环方式:

    for i in range(num)[s:e:step]:
    

    最近, 我写了一个循环 100000000 遍的代码, 不幸的是(也正是所预计的), Python 把机器内存吃光了, 并让我的 Windows 报虚拟内存不足的错误. 可怜的 Python 只能被操作系统无情地 kill 掉而不给任何机会.

    而 Cpy 的循环却毫无压力, 只占用了很小的内存.

    Posted by ideawu at 2012-07-24 12:17:20 Tags:
  • 2012-07-21

    众所期待 – 真正的类C通用型脚本编程语言出世了!

    Views: 18769 | 34 Comments

    虽然是借鉴了C语言的语法, 使用了Python语言的模型和运行环境, 但它是一个真正的*中国人自己完全自主发明创造的拥有自主知识产权的*(^_^)通用型脚本动态脚本编程语言, 而且是一个21世纪的编程语言, 在2012年这个世界末日之年正式诞生!

    它能做什么?

    它是通用型编程语言, 是一种动态语言, 是一种脚本语言, 可以用来做日常的文本处理, 也可以用来开发网络服务器和客户端, 可以用来做企业级开发... 总之, 只要Python能做的, 它就能做. 它和Python唯一的不同就是: 它是类C语法的! 这就避免了Python那种悬空的摇摇欲坠的混乱的代码风格的缺点, 有助于大型项目代码的开发.

    而且, 它能复用所有的Python内置模块和所有你写出来的Python代码, 你只需要简单的import它们即可.

    先来一个简洁的的例子吊一下你的胃口:
    Continue reading »

    Posted by ideawu at 2012-07-21 12:57:12 Tags:
|<<<1>>>| 1/1 Pages, 3 Results.