2012-07-24

Cpy是如何打败Python的

Views: 44248 | 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 的循环却毫无压力, 只占用了很小的内存.

Related posts:

  1. 开始学习 Python
  2. 用C语法来写Python代码
  3. PyPy – 吞下自己尾巴的小蟒蛇
  4. PHP求天数常犯的错误
  5. 我要转到 Windows 平台了
Posted by ideawu at 2012-07-24 12:17:20 Tags:

48 Responses to "Cpy是如何打败Python的"

  • 糟糕,没有合适的缩进。 Reply
  • 然后开始讨论您的cpy,请问,您能给出您这个语言的BNF吗?

    如果我想实现如同

    for i,j,k in zip(*[iter(range(9))]*3):
    print i,j,k

    该怎么办? Reply
    @mirguest: 请问你是要自己实现一个语言吗? 这方面可以看下 ANTLR 相关的, 它自带了一些小例子, 可以从这些例子出发实现自己的编程语言, 非常有趣. Reply
    @ideawu:
    他当时说,例如 int main() {}这样的东西,为何每次还要重复写?
    想for(;;)为何每次也要重复写。所以,我们对lisp非常感兴趣,
    数据和代码达到了一致性。

    当然,您的想法是一个类C的语法。可能和他不同。 Reply
    @mirguest: 你考虑过C语言为什么要有main函数吗? main函数是做什么用的吗? 没有它行不行? 明白了之后再谈省略才能更言之有物. Reply
    @ideawu:
    呵呵,惭愧。我的确不明白。还请您赐教。
    我在此处不发表见解。

    我关心的,其实还是您的那个foreach的问题。
    如果用上生成器,可以吗?我应该如何定义生成器? Reply
    @mirguest: 这个靠你自己去学习了. 建议你在对语言本身感兴趣的同时, 再花多一些时间使用语言, 先积累多一些经验.
    @ideawu:
    我同学对于一门新语言的想法,想一些重复出现的东西,能省就省。 Reply
    @ideawu:
    并不是我想实现。我只是问您,如果要实现python中这样的代码,
    在您的Cpy中应该怎么写。呵呵。只是感兴趣。 Reply
  • 您好,我尝试着运行了您的例子,挺好的。我也查了点资料,关于PHP中的循环。
    我大概理解您的意思,用for要保持C中的语义,而for each则用来迭代。
    看来是我们讨论的问题域没有弄清楚。我的观点是,在Python中的for in,
    其实和for each一样,用于迭代。 Reply
    @mirguest: 其实, Python 的 for in 如果迭代字典的 key,value, 必须写成 dict.items(), 而 foreach 直接 foreach(dict as k=>v), 而 "k=>"是可以省略的, 只迭代字典的元素. Reply
    @ideawu:
    我觉得您的理解太过于狭隘了。for in只是说,我有个东西要迭代。
    python本身并不关心您要迭代什么。

    如果像您这样,反而把迭代限制死了。

    如果限制之后,那么生成器该怎么用?

    呵呵,您如果感兴趣,可以看看这篇报告:
    http://www.dabeaz.com/generators/ Reply
  • 我觉得 for in 的语法,非常适合迭代器的表述。
    不知道lz对迭代器有何见解? Reply
    @mirguest: 关于迭代, 我建议使用 foreach, 因为 for in 是一种回朔的思维. 可参考 http://www.ideawu.net/blog/archives/650.html 里的讨论 Reply
    @ideawu: 我其实比较认同for in这样的表述。显得非常直观。因为就是要从一个迭代器中取出一个值而已。

    请问你说的回朔是什么意思?

    貌似兄弟的Cpy在水木里也有讨论啊。呵呵。 Reply
    @mirguest: 回朔和 look ahead. 写 for k in dict 表达式时, 你需要预先想到要迭代的是什么东西, 才能决定 in 前面应该写什么, 也就是思维多走了一步到了 in 之后, 然后才返回来写 in 前面的东西. 而 foreach 表达式, 你先想到要迭代什么东西, 然后才是如何迭代, 不会产生回朔. Reply
    @ideawu:
    说来惭愧,我不是很理解。对您的解释觉得有点绕。
    我无法辨别for in和您说的foreach之间的区别。
    用for in的时候,为何需要知道迭代的是什么?

    用迭代器就是为了获得一个个的元素。怎么会这么复杂? Reply
    @mirguest: 你可以到 https://code.google.com/p/cpy-scripting-language/downloads/list 下载来看看.
    @mirguest:
    如果您有空,最好能写篇博客,给出示例,好让大家学习学习。
    因为我到现在还是认为,for in 和 foreach 应该没有什么区别。
    您最好用您的 Cpy 写出foreach的例子,然后比较python中的 for in。
    @mirguest: 如果你想理解, 你需要进行更多的学习.
  • 好吧,从 range 到 xrange 再到 range,从 optparser 到 argparser,我怎么觉得在 python 上的投资一点都不保值 Reply
    @lyman: 有些东西还是要固定下来. Reply
  • Python 2下range是创建一个list,当然内存会爆掉。
    Python 3下range是默认懒惰求值,就不会爆了… Reply
  • 博主对于xrange以及懒惰求值真的不能理解吗… Reply
  • 这个要用xrange Reply
  • xrange 何在 Reply
    哈哈, xrange丢了. Reply
    加入了头像和评论回复盖楼, 好看多啦! Reply

« [1][2] » 2/2

Leave a Comment