我一直听到很多关于PyPy项目的消息.他们声称它比他们网站上的CPython解释器快6.3倍.
每当我们谈论像Python这样的动态语言时,速度是最重要的问题之一.为了解决这个问题,他们说PyPy的速度要快6.3倍.
第二个问题是并行性,臭名昭着的全球口译锁(GIL).为此,PyPy表示它可以提供无GIL的Python.
如果PyPy可以解决这些巨大的挑战,它的弱点是什么阻碍了更广泛的采用?也就是说,什么阻止像我这样的人,一个典型的Python开发人员,现在切换到PyPy ?
来自Google开源博客:
PyPy是Python在Python中的重新实现,使用先进的技术来尝试获得比CPython更好的性能.多年的努力终于得到了回报.我们的速度结果经常超过CPython,从稍微慢一点到实际应用程序代码的2倍加速,在小基准测试上加速到高达10倍.
这怎么可能?哪个Python实现用于实现PyPy?CPython?PyPyPy或PyPyPyPy击败他们得分的几率是多少?
(在相关的说明中...为什么有人会尝试这样的东西?)
我正在看PyPy,我只是想知道为什么它没有被采用到主线Python发行版中.不会像JIT编译和更低的内存占用大大提高所有Python代码的速度吗?
简而言之,PyPy的主要缺点是什么导致它仍然是一个单独的项目?
我试图实施Miller-Rabin素性测试,并且很困惑为什么中等数字(~7位数)需要这么长时间(> 20秒).我最终发现以下代码行是问题的根源:
x = a**d % n
Run Code Online (Sandbox Code Playgroud)
(where a
,d
和n
都是相似的,但是不相等的,中等数字,**
是取幂运算符,并且%
是模运算符)
然后我尝试用以下内容替换它:
x = pow(a, d, n)
Run Code Online (Sandbox Code Playgroud)
相比之下它几乎是瞬间完成的.
对于上下文,这是原始函数:
from random import randint
def primalityTest(n, k):
if n < 2:
return False
if n % 2 == 0:
return False
s = 0
d = n - 1
while d % 2 == 0:
s += 1
d >>= 1
for i in range(k):
rand = randint(2, n - 2)
x …
Run Code Online (Sandbox Code Playgroud) 应该使用什么fork或者包的组合来使PyPy,Django和PostgreSQL一起玩得很好?
我知道PyPy和Django一起玩得很好,但我不太确定PyPy和PostgreSQL.我确实看到Alex Gaynor制作了一个名为pypy-postgresql的PyPy 分支.我也知道有些人正在使用psycopg2-ctypes.
这些叉子之间有区别吗?或者我们应该使用稳定的1.9 PyPy并使用psycopg2-ctypes?使用ctypes选项可能会影响性能,请参阅下面的注释.
另外,有没有人在使用PyPy和pyscopg2时遇到任何陷阱?如果某些东西不能正常工作,那么回归CPython似乎很容易,但主要是我正在寻找程序员可以提前做好准备的事情.
我环顾四周,似乎psycopg2本身与PyPy一起工作.虽然psycopg2-ctypes似乎确实对某些人有用,但是有一个关于pypy-dev的讨论.我在Windows上工作,我不认为psycopg2-ctypes已经为Windows做好了准备,遗憾的是.
使用if foo is None
而不是if foo == None
测试值是否具体是标准惯例None
.
如果你想确定一个值是否正确True
(不仅仅是一个真实的值),是否有任何理由使用if foo == True
而不是if foo is True
?这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
示例:say True
用作要与值'bar'
或任何其他类似真值的值区分开的单例值:
if foo is True: # vs foo == True
...
elif foo == 'bar':
...
Run Code Online (Sandbox Code Playgroud)
是否存在使用if foo is True
会产生不同结果的情况if foo == True
?
注意:我知道Python布尔值 - 如果x:,则vs x == True,vs如果x为True.但是,它仅解决是否if foo
,if foo == True
或if foo is True
通常应用于确定是否foo
具有真实值. …
我直截了当吗?PyPy解释器是否真正解释自己然后翻译自己?
所以这是我目前的理解:
如果这是真的,那么这是我见过的最令人头疼的事情之一.
注意:标题是故意挑衅的(让你点击它并想要关闭投票的问题),我不想看起来全神贯注.
我一直在阅读和听到越来越多关于PyPy的内容.这就像一个线性图.
为什么PyPy如此特别?据我所知,用语言本身编写的动态语言的实现并不是那么罕见,或者我没有得到什么?
有些人甚至称PyPy为"未来"[python],或者在此实现中看到某种深层潜力.这究竟是什么意思?
我们广泛使用Twisted来处理需要大量异步io的应用程序.在某些情况下,东西是cpu绑定的,为此我们产生了一个进程池来完成工作,并有一个系统来管理多个服务器上的这些 - 所有这些都是在Twisted中完成的.效果很好.问题是很难让新团队成员加快速度.在Twisted中编写异步代码需要近乎垂直的学习曲线.就像人类自然不这么认为那样.
我们也许正在考虑采用混合方法.也许保持xmlrpc服务器部分和进程管理在Twisted中并在代码中实现其他东西,至少在某种程度上看起来是同步的,而不是这样.然后我又喜欢明确的隐含,所以我不得不考虑更多.无论如何,在greenlets上 - 这些东西有多好用?所以有Stackless,你可以从我的Gallentean头像中看到,我很清楚它在第一手使用CCP的旗舰EVE Online游戏方面取得了巨大的成功.那么Eventlet或gevent呢?好吧现在只有Eventlet与Twisted一起使用.然而gevent声称速度更快,因为它不是纯粹的python实现,而是依赖于libevent.它还声称具有较少的特性和缺陷.GEVENT据我所知,它由1个人维护.这让我有点怀疑,但是所有伟大的项目都是这样开始的...然后就是PyPy - 我还没有读完那篇文章 - 只是在这个帖子中看到它:Stackless的缺点.
令人困惑 - 我想知道该怎么做 - 听起来像Eventlet可能是最好的选择,但它真的足够稳定吗?那里的任何人有经验吗?我们应该选择Stackless,因为它已经存在并且是经过验证的技术 - 就像Twisted一样 - 并且它们可以很好地协同工作.但我仍然不愿意使用单独的Python版本来完成这项工作.该怎么办....
这个有点令人讨厌的博客文章对我来说很重要:对于Grownups的异步IO 我没有得到Twisted就像Java一样对我而言Java通常是你处于线程思维中的地方,但无论如何.然而,如果那个猴子补丁的东西真的像那样工作那么哇.哇哇!
我知道Django,PyPy和Psycopg2都可以正常工作,而speed.pypy.org声称比CPython有很大的性能提升.有什么缺点吗?