Stackless Python有什么缺点?

我最近一直在阅读关于Stackless Python的文章 ,与vanilla cPython相比,它似乎有很多优势。 它具有诸如无限recursion,微线程,延续等所有那些很酷的function,同时比cPython更快(大约10%,如果Python wiki是可信的) 并且兼容它(至less是版本2.5,2.6和3.0)。

所有这些看起来都太好了,不可能是真的。 然而, TANSTAAFL ,我并没有在Python社区看到Stackless的热情, PEP 219从来没有实现过。 这是为什么? Stackless有什么缺点? Stackless的衣柜里藏着什么骷髅?

(我知道Stackless并不提供真正的并发性,只是一种简单的并发编程方式,并不能真正打扰我。)

我不知道Wiki上的“Stackless速度快10%”是从哪里来的,但是我再也没有试过测量这些性能数字。 我想不出Stackless是如何做出重大改变的。

Stackless是一个惊人的工具,有几个组织/政治问题。

第一个来自历史。 Christian Tismer开始谈论10年前最终变成Stackless的事情。 他对自己想要的东西有一个想法,但很难解释他在做什么以及为什么人们应该使用它。 这部分是因为他的背景没有关于协同程序这样的想法的CS培训,而且因为他的演示和讨论都是以实现为导向的,所以对于那些还没有深入了解的人来说,很难理解如何使用它作为解决scheme他们的问题。

出于这个原因,最初的文件很差。 有一些如何使用它的说明,最好来自第三方贡献者。 在PyCon 2007上,我根据PyCon的调查数据,就“ 使用无堆栈 ”进行了很好的讨论。 Richard Tew在收集这些信息,更新stackless.com ,以及在新的Python发行版出现时维护发行版做得非常好。 他是CCP Games的一名雇员,EVE Online的开发者,他使用Stackless作为游戏系统的重要组成部分。

CCP游戏也是人们谈论Stackless时最大的现实世界的例子。 Stackless的主要教程是Grant Olson的“无堆栈Python并发编程入门 ”,也是面向游戏的。 我认为这给人们一个倾斜的想法,Stackless是面向游戏的,当时游戏更容易延续。

源代码是另一个难点。 Python的原始forms要求对Python的许多部分进行更改,这让Python的领导人Guido van Rossum警惕起来。 部分原因,我认为是对call / cc的支持,后来被删除为“当有更好的更高级别的表单时,就像支持goto一样”。 我不确定这个历史,所以你只要把这段话写成“Stackless过去需要太多改变”。

后来的版本不需要更改,Tismer继续推动将其纳入Python。 虽然有一些考虑,但官方的立场(据我所知)是CPython不仅是一个Python的实现,但它的意思是一个参考实现,它不会包括Stacklessfunction,因为它不能由Jython实现或铁蟒。

对“ 代码库的重大改变 ”绝对没有计划。 这个来自Arafangion的报价和参考超链接(见评论)大约在2000/2001年。 结构的变化早已完成了,这就是我上面提到的。 现在堆积如山是稳定和成熟的,在过去的几年里,只是对代码库进行了微小的调整。

Stackless的最后一个限制 – Stackless没有强烈的拥护者。 Tismer现在深入地参与了PyPy ,它是Python for Python的一个实现。 他已经在PyPy中实现了Stacklessfunction,认为它比Stackless本身更优越,并且认为PyPy是未来的方式。 Tew保持Stackless,但他对宣传不感兴趣。 我考虑过扮演这个angular色,但是看不到如何从中获得收入。

虽然如果你想在Stackless培训,请随时与我联系 ! 🙂

find这个讨论花了相当长的时间。 那时候我不是在PyPy上,而是和psyco有了两年的事情,直到健康突然停下来。 我现在又活跃起来,devise一种替代方法 – 将在2012年EuroPython上展示。

安德鲁斯的大部分陈述是正确的。 一些小的增加:

Stackless比10年前的CPython快得多,因为我优化了解释器循环。 当时圭多还没有准备好。 几年后,人们做了类似的优化,甚至更好的,这使得Stackless有点慢,正如预期的那样。

在包容性方面:呃,一开始我非常坚强,并且相信Stackless是一条可以走的路。 后来,当几乎可能被纳入的时候,我对此失去了兴趣,宁愿让它保持这种状态,部分是因为失望,部分是为了保持对Stackless的控制。

像“其他实现不能这样做”这样的论据总是让我感到惭愧,因为还有其他的例子可以使用这个论点。 我想我最好忘记这一点,并与Guido保持良好的友谊,有我自己的发行版。

同时事情又在改变。 我正在开发PyPy和Stackless作为扩展,有时会在后面讨论

干杯 – 克里斯

如果我没有记错的话,Stackless将被纳入到官方的CPython中,但Stackless的作者告诉CPython人员不要这样做,因为他打算对代码库做一些重大的修改 – 可以想象他希望在以后的时候完成整合该项目更加成熟。

我也对这里的答案感兴趣。 我已经玩了一下Stackless,看起来这对标准Python来说是一个很好的补充。

如果Python想要更改到不同的堆栈,PEP 219确实提到了从C代码调用Python代码的潜在困难。 需要有方法来检测和防止这种情况(以避免垃圾堆栈)。 我认为这很容易理解,所以我也想知道为什么Stackless必须独立。