diff --git a/README b/README index de90045ba162d007c5fe5412df14ca9a94a31cb2_UkVBRE1F..a6456ff7279d526d3d115faf2174e8f0b36167f0_UkVBRE1F 100644 --- a/README +++ b/README @@ -4,5 +4,5 @@ See source/README. The site is pull into pypy.org by a cron job on a psf-hosted instance, -see https://github.com/python/psf-chef/blob/master/cookbooks/pypy-home/recipes/default.rb +see https://github.com/python/psf-salt/tree/master/salt/pypy-web The people with access to the instance are the ones in @@ -8,3 +8,3 @@ The people with access to the instance are the ones in -https://github.com/python/psf-chef/tree/master/data_bags/users -with pypy-home access +https://github.com/python/psf-salt/blob/master/pillar/base/users.sls +with pypy-web access diff --git a/README-DO-NOT-EDIT b/README-DO-NOT-EDIT index de90045ba162d007c5fe5412df14ca9a94a31cb2_UkVBRE1FLURPLU5PVC1FRElU..a6456ff7279d526d3d115faf2174e8f0b36167f0_UkVBRE1FLURPLU5PVC1FRElU 100644 --- a/README-DO-NOT-EDIT +++ b/README-DO-NOT-EDIT @@ -1,2 +1,3 @@ -These html files are not written by hand! -See source/README. +The content of public is not written by hand! +It are generated via a Makefile. +The files in source/* are the old yatiblog sources. diff --git a/archive.html b/archive.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_YXJjaGl2ZS5odG1s..0000000000000000000000000000000000000000 --- a/archive.html +++ /dev/null @@ -1,74 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div class="section-info" id="all-articles"><strong>Blog Posts Archive</strong></div> -<ul> -</ul> -<br /> -<div class="section-info" id="all-articles"><strong>Other Articles</strong></div> -<ul> -</ul> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/compat.html b/compat.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_Y29tcGF0Lmh0bWw=..0000000000000000000000000000000000000000 --- a/compat.html +++ /dev/null @@ -1,149 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Python compatibility</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Python compatibility</h1> -<p>PyPy implements the Python language version 2.7.13. It supports all of the core -language, passing Python test suite (with minor modifications that were -already accepted in the main python in newer versions). It supports most -of the commonly used Python <a class="reference external" href="http://docs.python.org/library/">standard library modules</a>; details below.</p> -<p>PyPy3 implements the Python language version 3.6.9. It has been released, -but Python is a large language and it is quite possible that a few things are missing.</p> -<p class="download-menu"><a class="reference external" href="http://packages.pypy.org">List of installable top 1000 PyPI packages</a></p> -<p>PyPy has support for the <a class="reference external" href="http://docs.python.org/c-api/">CPython C API</a>, however there are constructs -that are <cite>not compatible</cite>. We strongly advise use of <a class="reference external" href="http://cffi.readthedocs.org/">CFFI</a> -instead. CFFI come builtin with PyPy. Many libraries will require -a bit of effort to work, but there are known success stories. Check out -PyPy blog for updates, as well as the <a class="reference external" href="https://bitbucket.org/pypy/compatibility/wiki/Home">Compatibility Wiki</a>.</p> -<p>C extensions need to be recompiled for PyPy in order to work. Depending on -your build system, it might work out of the box or will be slightly harder.</p> -<p>Standard library modules supported by PyPy. Note that large parts of python -library are implemented in pure python, so they don't have to be listed -there. Please just check if it imports. If it imports, it should work.</p> -<ul class="simple"> -<li><tt class="docutils literal">__builtin__, __pypy__, _ast, _cffi_backend, _codecs, _collections, _continuation, _csv, _file, _hashlib, _io, _locale, _lsprof, _md5, _minimal_curses, _multibytecodec, _multiprocessing, _numpypy, _pickle_support, _pypyjson, _random, _rawffi, _sha, _socket, _sre, _ssl, _struct, _testing, _warnings, _weakref, array, binascii, bz2, cStringIO, cmath, cppyy, cpyext, crypt, errno, exceptions, fcntl, gc, imp, itertools, marshal, math, mmap, operator, parser, posix, pwd, pyexpat, pypyjit, select, signal, symbol, sys, termios, thread, time, token, unicodedata, zipimport, zlib</tt></li> -</ul> -<p>Supported, but written in pure Python:</p> -<ul class="simple"> -<li><tt class="docutils literal">cPickle, ctypes, datetime, dbm, _functools, grp, readline, resource, sqlite3, syslog</tt></li> -</ul> -<p>All modules that are pure python in CPython of course work.</p> -<p>Python libraries known to work under PyPy (the list is not exhaustive). -A <a class="reference external" href="http://packages.pypy.org">fuller list</a> is available.</p> -<ul class="simple"> -<li>ctypes</li> -<li>django</li> -<li>sqlalchemy</li> -<li>flask</li> -<li>twisted</li> -<li>pylons</li> -<li>divmod's nevow</li> -<li>pyglet</li> -<li>Pillow (the PIL fork)</li> -<li><a class="reference external" href="https://github.com/amauryfa/lxml/tree/cffi/">lxml</a></li> -<li>NumPy</li> -</ul> -<p>The main difference that is not going to be fixed is that PyPy does -not support refcounting semantics. The following code won't fill the -file immediately, but only after a certain period of time, when the GC -does a collection:</p> -<div class="syntax python"><pre><span></span><span class="nb">open</span><span class="p">(</span><span class="s2">"filename"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"stuff"</span><span class="p">)</span><br/></pre></div> -<p>The proper fix is</p> -<div class="syntax python"><pre><span></span><span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"filename"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span><br/><span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"stuff"</span><span class="p">)</span><br/><span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span><br/></pre></div> -<p>or using the <tt class="docutils literal">with</tt> keyword</p> -<div class="syntax python"><pre><span></span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"filename"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span><br/> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"stuff"</span><span class="p">)</span><br/></pre></div> -<p>The same problem–not closing your files–can also show up if your -program opens a large number of files without closing them explicitly. -In that case, you can easily hit the system limit on the number of file -descriptors that are allowed to be opened at the same time.</p> -<p>Since release 5.4, PyPy can be run with the command-line option <tt class="docutils literal"><span class="pre">-X</span> -<span class="pre">track-resources</span></tt> (as in, <tt class="docutils literal">pypy <span class="pre">-X</span> <span class="pre">track-resources</span> myprogram.py</tt>). -This produces a ResourceWarning when the GC closes a non-closed file or -socket. The traceback for the place where the file or socket was -allocated is given as well, which aids finding places where <tt class="docutils literal">close()</tt> -is missing.</p> -<p>Similarly, remember that you must <tt class="docutils literal">close()</tt> a non-exhausted -generator in order to have its pending <tt class="docutils literal">finally</tt> or <tt class="docutils literal">with</tt> -clauses executed immediately:</p> -<div class="syntax python"><pre><span></span><span class="k">def</span> <span class="nf">mygen</span><span class="p">():</span><br/> <span class="k">with</span> <span class="n">foo</span><span class="p">:</span><br/> <span class="k">yield</span> <span class="mi">42</span><br/><br/><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mygen</span><span class="p">():</span><br/> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">42</span><span class="p">:</span><br/> <span class="k">break</span> <span class="c1"># foo.__exit__ is not run immediately!</span><br/><br/><span class="c1"># fixed version:</span><br/><span class="n">gen</span> <span class="o">=</span> <span class="n">mygen</span><span class="p">()</span><br/><span class="k">try</span><span class="p">:</span><br/> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">gen</span><span class="p">:</span><br/> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">42</span><span class="p">:</span><br/> <span class="k">break</span><br/><span class="k">finally</span><span class="p">:</span><br/> <span class="n">gen</span><span class="o">.</span><span class="n">close</span><span class="p">()</span><br/></pre></div> -<p>More generally, <tt class="docutils literal">__del__()</tt> methods are not executed as predictively -as on CPython: they run “some time later” in PyPy (or not at all if -the program finishes running in the meantime). See <a class="reference external" href="http://pypy.readthedocs.org/en/latest/cpython_differences.html#differences-related-to-garbage-collection-strategies">more details -here</a>.</p> -<p>Note that PyPy returns unused memory to the operating system if there -is a madvise() system call (at least Linux, OS X, BSD) or on Windows. It is -important to realize that you may not see this in <tt class="docutils literal">top</tt>. The unused -pages are marked with <tt class="docutils literal">MADV_FREE</tt>, which tells the system “if you -need more memory at some point, grab this page”. As long as memory is -plentiful, the <tt class="docutils literal">RES</tt> column in <tt class="docutils literal">top</tt> might remains high. (Exceptions to -this rule are systems with no <tt class="docutils literal">MADV_FREE</tt>, where we use -<tt class="docutils literal">MADV_DONTNEED</tt>, which forcefully lowers the <tt class="docutils literal">RES</tt>. This includes -Linux <= 4.4.)</p> -<p>A more complete list of known differences is available at <a class="reference external" href="http://pypy.readthedocs.org/en/latest/cpython_differences.html">our dev site</a>.</p> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/contact.html b/contact.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_Y29udGFjdC5odG1s..0000000000000000000000000000000000000000 --- a/contact.html +++ /dev/null @@ -1,80 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Contact</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Contact</h1> -<ul class="simple"> -<li>irc: <strong>#pypy</strong> on <strong>irc.freenode.net</strong></li> -<li>mailing list: <a class="reference external" href="http://mail.python.org/mailman/listinfo/pypy-dev">pypy-dev at python.org</a></li> -<li>for security related issues, non-public funding enquiries etc. please contact <a class="reference external" href="mailto:pypy-z@python.org">pypy-z@python.org</a></li> -<li>the bitbucket <a class="reference external" href="https://bitbucket.org/pypy/pypy/issues?status=new&status=open">bug tracker</a> (registration required to open new issues or to comment)</li> -<li>more on our <a class="reference external" href="http://doc.pypy.org">dev site</a>.</li> -<li>code on <a class="reference external" href="https://bitbucket.org/pypy/pypy/overview">bitbucket</a>.</li> -</ul> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/don1.html b/don1.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_ZG9uMS5odG1s..0000000000000000000000000000000000000000 --- a/don1.html +++ /dev/null @@ -1,44 +0,0 @@ -<ul> - <li> - <a href="#" onclick="stm_donate(); return false;">Donate towards STM in pypy</a><br/> - <a href="#" onclick="py3k_donate(); return false;"><b>Donate towards py3k in pypy</b></a><br/> - <a href="#" onclick="general_donate(); return false;">Donate towards general pypy progress</a><br/> - <!-- a href="#" onclick="numpy_donate(); return false;">Donate towards NumPy in pypy</a><br/ --!> - </li> - <li> -<script> - $(function() { - $("#progressbar").progressbar({ - value: 65.2 - }); - }); -</script> - - <!-- Income:PyPy:Donations:Py3k / 0.95 --> - $68455 of $105000 (65.2%) - <div id="progressbar"> - </div> - - </li> - <li> - <span id="donate_text">This donation goes towards supporting Python 3 in PyPy. - Current status: - we have $4093 left - in the account.</br> <a href="py3donate.html">Read proposal</a></span> - </li> - <li> - <div class="sidepic"> - <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> - <input type="hidden" name="cmd" value="_s-xclick"/> - <input type="hidden" name="hosted_button_id" value="XBG5EK3URC5G8"/> - <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"/> - <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1"/> - </form> - </div> - </li> - <li> - <div class="sidepic"> - <a id="main_download" href="download.html">Download PyPy</a> - </div> - </li> -</ul> diff --git a/don2.html b/don2.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_ZG9uMi5odG1s..0000000000000000000000000000000000000000 --- a/don2.html +++ /dev/null @@ -1,31 +0,0 @@ -<ul> - <li> - <!-- <a href="#" onclick="stm_donate(); return false;">Donate towards STM in pypy</a><br/> --> - <!-- <a href="#" onclick="py3k_donate(); return false;">Donate towards py3k in pypy</a><br/> --> - <b>Donate towards general PyPy progress</b><br/> - <!-- a href="#" onclick="numpy_donate(); return false;">Donate towards NumPy in pypy</a><br/ --!> - </li> - <li> - <!-- - <span id="donate_text">This donation will go towards general PyPy progress - --!> - <span id="donate_text">PyPy cannot accept donations at the moment - </li> - <li> - <div class="sidepic"> - <!-- - <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> -<input type="hidden" name="cmd" value="_s-xclick" /> -<input type="hidden" name="hosted_button_id" value="J268ZTLRE2BW8" /> -<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!" /> -<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" /> -</form> ---!> - </div> - </li> - <li> - <div class="sidepic"> - <a id="main_download" href="download.html">Download PyPy</a> - </div> - </li> -</ul> diff --git a/don3.html b/don3.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_ZG9uMy5odG1s..0000000000000000000000000000000000000000 --- a/don3.html +++ /dev/null @@ -1,45 +0,0 @@ -<ul> - <li> - <a href="#" onclick="stm_donate(); return false;">Donate towards STM in pypy</a><br/> - <a href="#" onclick="py3k_donate(); return false;">Donate towards py3k in pypy</a><br/> - <a href="#" onclick="general_donate(); return false;">Donate towards general pypy progress</a><br/> - <!-- a href="#" onclick="numpy_donate(); return false;"><b>Donate towards NumPy in pypy</b></a><br/ --!> - </li> - <li> -<script> - $(function() { - $("#progressbar").progressbar({ - value: 88.7 - }); - }); -</script> - - <!-- Income:PyPy:Donations:Numpy / 0.95 --> - $53247 of $60000 (88.7%) - <div id="progressbar"> - </div> - - </li> - <li> - <span id="donate_text">This donation goes towards supporting NumPy in PyPy. - Current status: - we have $8029 left - in the account.</br> <a href="numpydonate.html">Read proposal</a></span> - </li> - <li> - <div class="sidepic"> - <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> - <input type="hidden" name="cmd" value="_s-xclick"> - <input type="hidden" name="hosted_button_id" value="7SMJUEAP83RFQ"> - <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"> - <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1"> - </form> - </div> - </li> - <li> - <div class="sidepic"> - <a id="main_download" href="download.html">Download PyPy</a> - </div> - </li> -</ul> - diff --git a/don4.html b/don4.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_ZG9uNC5odG1s..0000000000000000000000000000000000000000 --- a/don4.html +++ /dev/null @@ -1,52 +0,0 @@ -<ul> - <li> - <a href="#" onclick="stm_donate(); return false;"><b>Donate towards STM in pypy</b></a><br/> - <a href="#" onclick="py3k_donate(); return false;">Donate towards py3k in pypy</a><br/> - <a href="#" onclick="general_donate(); return false;">Donate towards general pypy progress</a><br/> - <!-- a href="#" onclick="numpy_donate(); return false;">Donate towards NumPy in pypy</a><br/ --!> - </li> - <li> -<script> - $(function() { - $("#progressbar").progressbar({ - value: 74.0 - }); - }); -</script> - - 2nd call: - <!-- Income:PyPy:Donations:Transactional Memory from April 8, 2014, - divided by 0.9 --> - $59201 of $80000 (74.0%) - <div id="progressbar"> - </div> - - </li> - <li> - <span id="donate_text">At this time, donations towards supporting the - Transactional Memory in PyPy are closed. <a href="tmdonate2.html">Read - more...</a></span> - - <!-- - Current status: - we have $47383 left - in the account.</br> <a href="tmdonate2.html">Read proposal (2nd call)</a></span> - </li> - <li> - <li> - <div class="sidepic"> - <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> - <input type="hidden" name="cmd" value="_s-xclick"> - <input type="hidden" name="hosted_button_id" value="XU6QHLK6CZX6E"> - <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"> - <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1"> - </form> - </div> - </li> - <li> - <div class="sidepic"> - <a id="main_download" href="download.html">Download PyPy</a> - </div--> - </li> -</ul> - diff --git a/download.html b/download.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_ZG93bmxvYWQuaHRtbA==..0000000000000000000000000000000000000000 --- a/download.html +++ /dev/null @@ -1,453 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Download and install</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Download and install</h1> -<p class="download-menu">There are <a class="reference external" href="http://buildbot.pypy.org/nightly/trunk/">nightly binary builds</a> available. Those builds are not always -as stable as the release, but they contain numerous bugfixes and -performance improvements.</p> -<p>We provide binaries for x86, aarch64, ppc64 and s390x running on different operating systems such as -Linux, Mac OS X and Windows (<a class="reference external" href="http://doc.pypy.org/en/latest/release-v7.3.0.html">what's new in PyPy 7.3.0?</a>):</p> -<ul class="simple"> -<li>the Python2.7 compatible release — <strong>PyPy2.7 v7.3.0</strong></li> -<li>the Python3.6 compatible release — <strong>PyPy3.6 v7.3.0</strong></li> -<li>the Python2.7 Software Transactional Memory special release — <strong>PyPy-STM 2.5.1</strong> (Linux x86-64 only)</li> -</ul> -<ul class="download-menu simple"> -<li>Download<ul> -<li><a class="reference internal" href="#default-with-a-jit-compiler">Default (with a JIT Compiler)</a></li> -<li><a class="reference internal" href="#other-versions">Other versions</a></li> -</ul> -</li> -<li><a class="reference internal" href="#installing">Installing</a> (optional)</li> -<li><a class="reference internal" href="#installing-more-modules">Installing more modules</a></li> -<li><a class="reference internal" href="#building-from-source">Building from source</a></li> -<li><a class="reference internal" href="#packaging">Packaging</a></li> -<li><a class="reference internal" href="#checksums">Checksums</a></li> -</ul> -<div class="section" id="jit-compiler-version"> -<span id="default-with-a-jit-compiler"></span><h1>“JIT Compiler” version</h1> -<p>These binaries include a Just-in-Time compiler. They only work on -x86 CPUs that have the <a class="reference external" href="http://en.wikipedia.org/wiki/SSE2">SSE2</a> instruction set (most of -them do, nowadays), or on x86-64 CPUs. They also contain <a class="reference external" href="http://www.stackless.com/">stackless</a> -extensions, like <a class="reference external" href="http://pypy.readthedocs.org/en/latest/stackless.html#greenlets">greenlets</a>.</p> -</div> -<div class="section" id="linux-binaries-and-common-distributions"> -<h1>Linux binaries and common distributions</h1> -<p>Since version 7.3, the linux x86 binaries in the links below ship with versions -of OpenSSL, SQLite3, libffi, expat, and TCL/TK binary libraries linked in. This -make the binaries “portable” so that they should run on any current glibc-based -linux platform. The ideas were adopted from the <a class="reference external" href="https://github.com/squeaky-pl/portable-pypy#portable-pypy-distribution-for-linux">portable-pypy</a> package.</p> -<p>This solution to the portability problem means that the versions of the -packaged libraries are frozen to the version shipped, so updating your system -libraries will not affect this installation of PyPy. Also see the note about -SSL certificates below.</p> -<p>For aarch64, s390x, and ppc64, the binaries target a specific operating system. -These binaries are dynamically linked, and thus might not be usable due to the -sad story of linux binary compatibility. This means that <strong>Linux binaries are -only usable on the distributions written next to them</strong> unless you're ready to -hack your system by adding symlinks to the libraries it tries to open. There -are better solutions:</p> -<ul class="simple"> -<li>download PyPy from your release vendor (usually an outdated -version): <a class="reference external" href="http://packages.ubuntu.com/search?keywords=pypy&searchon=names">Ubuntu</a> (<a class="reference external" href="https://launchpad.net/~pypy/+archive/ppa">PPA</a>), <a class="reference external" href="http://packages.debian.org/sid/pypy">Debian</a>, <a class="reference external" href="https://github.com/Homebrew/homebrew-core/blob/master/Formula/pypy.rb">Homebrew</a>, MacPorts, -<a class="reference external" href="http://fedoraproject.org/wiki/Features/PyPyStack">Fedora</a>, <a class="reference external" href="http://packages.gentoo.org/package/dev-python/pypy">Gentoo</a> and <a class="reference external" href="https://wiki.archlinux.org/index.php/PyPy">Arch</a> are known to package PyPy, with various -degrees of being up-to-date.</li> -<li>use <tt class="docutils literal">sudo snap install <span class="pre">--classic</span> <package></tt>, where <tt class="docutils literal"><package></tt> is -<tt class="docutils literal">pypy</tt> or <cite>pypy3`</cite>. Snap is a non-vendor specific package manager for -linux, and repackages the download tarballs below with the latest platform- -specific libraries (again, without changing <tt class="docutils literal">libffi</tt>).</li> -<li><a class="reference external" href="https://doc.pypy.org/en/latest/build.html#build-cffi-import-libraries-for-the-stdlib">recompile the CFFI-based</a> TCL/TK, OpenSSL, or sqlite3 modules, using system -libraries and the scripts in <tt class="docutils literal">pypy/lib_pypy</tt>. This solution will not solve -compatibility issues with libffi, since that is baked into PyPy.</li> -<li>or <a class="reference internal" href="#translate">translate</a> your own PyPy.</li> -</ul> -<p class="download-menu">SSL Certificates</p> -<p class="download-menu">While the linux binaries ship an OpenSSL library, they do not ship a -certificate store for SSL certificates. If you wish to use SSL module, -you will need a valid certificate store. You can use the <a class="reference external" href="https://pypi.org/project/certifi/">certifi</a> package -and set <tt class="docutils literal">SSL_CERT_FILE</tt> to <tt class="docutils literal">certifi.where()</tt> or install your platform -certificates which should be discovered by the <tt class="docutils literal">_ssl</tt> module.</p> -</div> -<div class="section" id="python2-7-compatible-pypy-7-3-0"> -<span id="release"></span><h1>Python2.7 compatible PyPy 7.3.0</h1> -<ul class="download-menu simple"> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-linux32.tar.bz2">Linux x86 binary (32bit, built on CenOS6)</a></li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-linux64.tar.bz2">Linux x86-64 binary (64bit, built on CentOS6)</a></li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-osx64.tar.bz2">Mac OS X binary (64bit)</a></li> -<li>FreeBSD x86 and x86_64: see <a class="reference external" href="http://www.freshports.org/lang/pypy">FreshPorts</a></li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-win32.zip">Windows binary (32bit)</a> (you might need the VC runtime library -installer <a class="reference external" href="https://www.microsoft.com/en-us/download/details.aspx?id=52685">vcredist.x86.exe</a>.)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-aarch64.tar.bz2">Linux aarch64 binary (64bit, built on Ubuntu 18.04)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-ppc64.tar.bz2">PowerPC PPC64 Linux binary (64bit big-endian, Fedora 20)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-ppc64le.tar.bz2">PowerPC PPC64le Linux binary (64bit little-endian, Fedora 21)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-s390x.tar.bz2">s390x Linux binary (built on Redhat Linux 7.2)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-src.tar.bz2">Source (tar.bz2)</a>; <a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-src.zip">Source (zip)</a>. See below for more about the sources.</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads">All our downloads,</a> including previous versions. We also have a -<a class="reference external" href="http://buildbot.pypy.org/mirror/">mirror</a>, but please use only if you have troubles accessing the links above</li> -</ul> -</div> -<div class="section" id="python-3-6-compatible-pypy3-6-v7-3-0"> -<h1>Python 3.6 compatible PyPy3.6 v7.3.0</h1> -<ul class="download-menu simple"> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-linux64.tar.bz2">Linux x86-64 binary (64bit, built on CentOS6)</a></li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-linux32.tar.bz2">Linux x86 binary (32bit, built on CentOS6)</a></li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-osx64.tar.bz2">Mac OS X binary (64bit)</a> (High Sierra >= 10.13, not for Sierra and below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-win32.zip">Windows binary (32bit)</a> (you might need the VC runtime library -installer <a class="reference external" href="https://www.microsoft.com/en-us/download/details.aspx?id=52685">vcredist.x86.exe</a>.)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-aarch64.tar.bz2">Linux aarch64 binary (64bit, built on Ubuntu 18.04)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-ppc64.tar.bz2">PowerPC PPC64 Linux binary (64bit big-endian, Fedora 20)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-ppc64le.tar.bz2">PowerPC PPC64le Linux binary (64bit little-endian, Fedora 21)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-s390x.tar.bz2">s390x Linux binary (built on Redhat Linux 7.2)</a> (see <tt class="docutils literal">[1]</tt> below)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-src.tar.bz2">Source (tar.bz2)</a>; <a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-src.zip">Source (zip)</a>. See below for more about the sources.</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads">All our downloads,</a> including previous versions. We also have a -<a class="reference external" href="http://buildbot.pypy.org/mirror/">mirror</a>, but please use only if you have troubles accessing the links above</li> -</ul> -<p>If your CPU is really, really old, it may be a x86-32 without SSE2. -There is untested support for manually translating PyPy's JIT without -SSE2 (<tt class="docutils literal"><span class="pre">--jit-backend=x86-without-sse2</span></tt>) but note that your machine -is probably low-spec enough that running CPython on it is a better -idea in the first place.</p> -<p><tt class="docutils literal">[1]:</tt> stating it again: the Linux binaries are provided for the -distributions listed here. <strong>If your distribution is not exactly this -one, it won't work,</strong> you will probably see: <tt class="docutils literal">pypy: error while loading shared -libraries: …</tt>.</p> -</div> -<div class="section" id="pypy-stm-2-5-1"> -<h1>PyPy-STM 2.5.1</h1> -<p>This is a special version of PyPy! See the <a class="reference external" href="http://doc.pypy.org/en/latest/stm.html">Software Transactional -Memory</a> (STM) documentation.</p> -<ul class="simple"> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy-stm-2.5.1-linux64.tar.bz2">PyPy-STM Linux x86-64 binary (64bit, tar.bz2 built on Ubuntu 12.04 - 16.04)</a></li> -</ul> -</div> -<div class="section" id="other-versions"> -<span id="other-versions-without-a-jit"></span><h1>Other versions</h1> -<p>The other versions of PyPy are:</p> -<ul class="simple"> -<li>The most up-to-date <a class="reference external" href="http://buildbot.pypy.org/nightly/trunk/">nightly binary builds</a> with a JIT, if the official -release is too old for what you want to do. There are versions for -different libc on this site too.</li> -<li>Reverse debugger: This version enables debugging your Python -programs by going forward and backward in time. See the <a class="reference external" href="https://bitbucket.org/pypy/revdb/">RevDB -documentation</a>.</li> -</ul> -<ul class="simple"> -<li>Old-style sandboxing: A special safe version. -<em>This is NOT the version announced in-development during 2019!</em> -Read the docs about <a class="reference external" href="features.html#sandboxing">sandboxing</a>. -This version is <strong>not supported</strong> and not actively maintained. You -will likely have to fix some issues yourself, or checkout an old -version, or otherwise play around on your own. We provide this -documentation only for historical reasons. Please do not use in -production. For reference, there are some very old, unmaintained -binaries for Linux (<a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy-1.8-sandbox-linux64.tar.bz2">32bit</a>, <a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy-1.8-sandbox-linux.tar.bz2">64bit</a>).</li> -</ul> -</div> -<div class="section" id="installing"> -<h1>Installing</h1> -<p>All binary versions are packaged in a <tt class="docutils literal">tar.bz2</tt> or <tt class="docutils literal">zip</tt> file. When -uncompressed, they run in-place. You can uncompress them -either somewhere in your home directory or, say, in <tt class="docutils literal">/opt</tt>. -If you want, put a symlink from somewhere like -<tt class="docutils literal">/usr/local/bin/pypy</tt> to <tt class="docutils literal">/path/to/pypy_expanded/bin/pypy</tt>. Do -not move or copy the executable <tt class="docutils literal">pypy</tt> outside the tree – put -a symlink to it, otherwise it will not find its libraries.</p> -</div> -<div class="section" id="installing-more-modules"> -<h1>Installing more modules</h1> -<p>There are as yet few distribution-ready packages. -We recommend installing <tt class="docutils literal">pip</tt>, which is the standard package -manager of Python. It works like it does on CPython as explained in the -<a class="reference external" href="http://doc.pypy.org/en/latest/install.html">installation documentation</a>.</p> -<p>If you use your distribution's PyPy package we recommend you install packages -into a virtualenv. If you try to build a module and the build process complains -about “missing Python.h”, you may need to install the pypy-dev package.</p> -</div> -<div class="section" id="building-from-source"> -<span id="translate"></span><h1>Building from source</h1> -<p>(see more build <a class="reference external" href="http://pypy.readthedocs.org/en/latest/build.html">instructions</a>)</p> -<ol class="arabic"> -<li><p class="first">Get the source code. The preferred way is to checkout the current -trunk using <a class="reference external" href="https://www.mercurial-scm.org/">Mercurial</a>. The trunk usually works and is of course -more up-to-date. The following command should run in about 7 minutes -nowadays if you have hg >= 3.7 (it is much slower with older versions):</p> -<pre class="literal-block"> -hg clone https://bitbucket.org/pypy/pypy -</pre> -<p>The trunk contains PyPy 2. For PyPy 3, switch to the correct branch:</p> -<pre class="literal-block"> -# for PyPy 3: switch to the branch of PyPy that implements Python 3.6 -hg update py3.6 -</pre> -<p>Alternatively, get one of the following smaller packages for the source at -the same revision as the above binaries:</p> -<ul class="simple"> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.3.0-src.tar.bz2">pypy2.7-v7.3.0-src.tar.bz2</a> (sources, PyPy 2 only)</li> -<li><a class="reference external" href="https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.3.0-src.tar.bz2">pypy3.6-v7.3.0-src.tar.bz2</a> (sources, PyPy 3 only)</li> -</ul> -</li> -<li><p class="first">Make sure you <strong>installed the dependencies.</strong> See the list <a class="reference external" href="http://pypy.readthedocs.org/en/latest/build.html#install-build-time-dependencies">here</a>.</p> -</li> -<li><p class="first">Enter the <tt class="docutils literal">goal</tt> directory:</p> -<pre class="literal-block"> -cd pypy/pypy/goal -</pre> -</li> -<li><p class="first">Run the <tt class="docutils literal">rpython</tt> script. Here are the common combinations -of options (works also with <tt class="docutils literal">python</tt> instead of <tt class="docutils literal">pypy</tt>; -requires CPython 2.7 or PyPy 2, even to build PyPy 3):</p> -<pre class="literal-block"> -pypy ../../rpython/bin/rpython -Ojit targetpypystandalone # get the JIT version -pypy ../../rpython/bin/rpython -O2 targetpypystandalone # get the no-jit version -pypy ../../rpython/bin/rpython -O2 --sandbox targetpypystandalone # get the sandbox version -</pre> -</li> -<li><p class="first">Enjoy Mandelbrot <tt class="docutils literal"><span class="pre">:-)</span></tt> It takes on the order of half an hour to -finish the translation, and about 3GB of RAM on a 32-bit system -and about 5GB on 64-bit systems. (Do not start a translation on a -machine with insufficient RAM! It will just swap forever. See -notes below in that case.)</p> -</li> -<li><p class="first">If you want to install this PyPy as root, please read the next section, -<a class="reference internal" href="#packaging">Packaging</a>.</p> -</li> -</ol> -<p>Notes:</p> -<ul> -<li><p class="first">It is recommended to use PyPy to do translations, instead of using CPython, -because it is twice as fast. You should just start by downloading an -official release of PyPy (with the JIT). If you really have to use CPython -then note that we are talking about CPython 2.7 here, not CPython 3.x. -(Older versions like 2.6 are out.)</p> -</li> -<li><p class="first">On some 32-bit systems, the address space limit of 2 or 3 GB of RAM -can be an issue. More generally you may be just a little bit low of -RAM. First note that 2 GB is really not enough nowadays; on Windows -you first need to refer to the <a class="reference external" href="http://doc.pypy.org/en/latest/windows.html#preparing-windows-for-the-large-build">Windows build instructions</a>. More -precisely, translation on 32-bit takes at this point 2.7 GB if PyPy is -used and 2.9 GB if CPython is used. There are two workarounds:</p> -<p>1. use PyPy, not CPython. If you don't have any PyPy so far, not even -an older version, then you need to build one first, with some parts -removed. So, first translate with <tt class="docutils literal"><span class="pre">...rpython</span> <span class="pre">-Ojit</span> -targetpypystandalone <span class="pre">--withoutmod-micronumpy</span> <span class="pre">--withoutmod-cpyext</span></tt>, -then copy <tt class="docutils literal"><span class="pre">pypy-c</span></tt> and <tt class="docutils literal">libpypy_c.so</tt> somewhere else, and finally -call it with <tt class="docutils literal"><span class="pre">...pypy-c</span> <span class="pre">../../rpython/bin/rpython</span> <span class="pre">-Ojit</span></tt>.</p> -<p>2. if even using PyPy instead of CPython is not enough, try to tweak -some internal parameters. Example (slower but saves around 400MB):</p> -<pre class="literal-block"> -PYPY_DONT_RUN_SUBPROCESS=1 PYPY_GC_MAX_DELTA=200MB pypy --jit loop_longevity=300 ../../rpython/bin/rpython -Ojit --source -# then read the next point about --source -</pre> -</li> -<li><p class="first">You can run translations with <tt class="docutils literal"><span class="pre">--source</span></tt>, which only builds the C -source files (and prints at the end where). Then you can <tt class="docutils literal">cd</tt> there -and execute <tt class="docutils literal">make</tt>. This is another way to reduce memory usage. -Note that afterwards, you have to run manually <tt class="docutils literal"><span class="pre">pypy-c</span> -<span class="pre">.../pypy/tool/build_cffi_imports.py</span></tt> if you want to be able to import -the cffi-based modules.</p> -</li> -<li><p class="first">Like other JITs, PyPy doesn't work out of the box on some Linux -distributions that trade full POSIX compliance for extra security -features. E.g. with PAX, you have to run PyPy with <tt class="docutils literal">paxctl <span class="pre">-cm</span></tt>. -This also applies to translation (unless you use CPython to run the -translation and you specify <tt class="docutils literal"><span class="pre">--source</span></tt>).</p> -</li> -</ul> -</div> -<div class="section" id="packaging"> -<h1>Packaging</h1> -<p>Once PyPy is translated from source the binary package similar to those -provided in the section <a class="reference internal" href="#default-with-a-jit-compiler">Default (with a JIT Compiler)</a> above could be -easily created with <tt class="docutils literal">package.py</tt> script as following:</p> -<pre class="literal-block"> -cd ./pypy/pypy/tool/release/ -python package.py --help #for information -python package.py --archive-name pypy-my-own-package-name -</pre> -<p>It is recommended to use package.py because custom scripts will -invariably become out-of-date. If you want to write custom scripts -anyway, note an easy-to-miss point: some modules are written with CFFI, -and require some compilation. If you install PyPy as root without -pre-compiling them, normal users will get errors:</p> -<ul class="simple"> -<li>PyPy 2.5.1 or earlier: normal users would see permission errors. -Installers need to run <tt class="docutils literal">pypy <span class="pre">-c</span> “import gdbm”</tt> and other similar -commands at install time; the exact list is in <a class="reference external" href="https://bitbucket.org/pypy/pypy/src/default/pypy/tool/release/package.py">package.py</a>. Users -seeing a broken installation of PyPy can fix it after-the-fact if they -have sudo rights, by running once e.g. <tt class="docutils literal">sudo pypy <span class="pre">-c</span> "import gdbm</tt>.</li> -<li>PyPy 2.6 and later: anyone would get <tt class="docutils literal">ImportError: no module named -_gdbm_cffi</tt>. Installers need to run <tt class="docutils literal">pypy _gdbm_build.py</tt> in the -<tt class="docutils literal">lib_pypy</tt> directory during the installation process (plus others; -see the exact list in <a class="reference external" href="https://bitbucket.org/pypy/pypy/src/default/pypy/tool/release/package.py">package.py</a>). Users seeing a broken -installation of PyPy can fix it after-the-fact, by running <tt class="docutils literal">pypy -/path/to/lib_pypy/_gdbm_build.py</tt>. This command produces a file -called <tt class="docutils literal"><span class="pre">_gdbm_cffi.pypy-41.so</span></tt> locally, which is a C extension -module for PyPy. You can move it at any place where modules are -normally found: e.g. in your project's main directory, or in a -directory that you add to the env var <tt class="docutils literal">PYTHONPATH</tt>.</li> -</ul> -</div> -<div class="section" id="checksums"> -<h1>Checksums</h1> -<p>Here are the checksums for each of the downloads of PyPy 7.3.0, 7.2.0, 7.1.1, 7.1.0</p> -<p>pypy2.7-7.3.0 sha256:</p> -<pre class="literal-block"> -a3dd8d5e2a656849fa344dce4679d854a19bc4a096a0cf62b46a1be127a5d56c pypy2.7-v7.3.0-aarch64.tar.bz2 -eac1308b7d523003a5f6d20f58406d52ab14611bcec750122ae513a5a35110db pypy2.7-v7.3.0-linux32.tar.bz2 -f4950a54378ac637da2a6defa52d6ffed96af12fcd5d74e1182fb834883c9826 pypy2.7-v7.3.0-linux64.tar.bz2 -ca7b056b243a6221ad04fa7fc8696e36a2fb858396999dcaa31dbbae53c54474 pypy2.7-v7.3.0-osx64.tar.bz2 -82e62869812aa2953a4f83e96c813cbc52973dfa5e42605e72b6610ac13f2481 pypy2.7-v7.3.0-ppc64.tar.bz2 -592a6db77270b922ffa13cbeced9eabbc36c532ded9fc145f6a19073d3e78499 pypy2.7-v7.3.0-ppc64le.tar.bz2 -d254b82a00021339762198e41ba7f72316010d0f9bd4dcd7b0755185da9c005e pypy2.7-v7.3.0-s390x.tar.bz2 -b0b25c7f8938ab0fedd8dedf26b9e73c490913b002b484c1b2f19d5844a518de pypy2.7-v7.3.0-src.tar.bz2 -42dc84a277e7a5e635fe39bbd745f06135902c229a257123332b7555800d915b pypy2.7-v7.3.0-src.zip -a9e3c5c983edba0313a41d3c1ab55b080816c4129e67a6c272c53b9dbcdd97ec pypy2.7-v7.3.0-win32.zip -</pre> -<p>pypy3.6-7.3.0 sha256:</p> -<pre class="literal-block"> -b900241bca7152254c107a632767f49edede99ca6360b9a064141267b47ef598 pypy3.6-v7.3.0-aarch64.tar.bz2 -7045b295d38ba0b5ee65bd3f078ca249fcf1de73fedeaab2d6ad78de2eab0f0e pypy3.6-v7.3.0-linux32.tar.bz2 -d3d549e8f43de820ac3385b698b83fa59b4d7dd6cf3fe34c115f731e26ad8856 pypy3.6-v7.3.0-linux64.tar.bz2 -87b2545dad75fe3027b4b2108aceb9fdadcdd24e61ae312ac48b449fdd452bf3 pypy3.6-v7.3.0-osx64.tar.bz2 -e2587e8da2abb12a86bf75941ce739124d2a1156367a9a3d729ac31d0841c300 pypy3.6-v7.3.0-ppc64.tar.bz2 -d6f3b701313df69483b43ebdd21b9652ae5e808b2eea5fbffe3b74b82d2e7433 pypy3.6-v7.3.0-ppc64le.tar.bz2 -0fe2f7bbf42ea88b40954d7de773a43179a44f40656f2f58201524be70699544 pypy3.6-v7.3.0-s390x.tar.bz2 -48d12c15fbcbcf4a32882a883195e1f922997cde78e7a16d4342b9b521eefcfa pypy3.6-v7.3.0-src.tar.bz2 -8ae9efd0a2aadb19e892bbd07eca8ef51536296a3ef93964149aceba511e79ca pypy3.6-v7.3.0-src.zip -30e6870c4f3d8ef91890a6556a98080758000ba7c207cccdd86a8f5d358998c1 pypy3.6-v7.3.0-win32.zip -</pre> -<p>pypy2.7-7.2.0 sha256:</p> -<pre class="literal-block"> -57b0be053c6a5f069e23b843f38863cf7920f5eef7bc89f2e086e5c3a28a2ba9 pypy2.7-v7.2.0-aarch64.tar.bz2 -76d666e5aee54b519d6ec1af4ef0cbdc85f7f9276dd554e97deb026adfd0c936 pypy2.7-v7.2.0-linux32.tar.bz2 -05acf28e6a243026ecad933b9361d8f74b41f00818071b76b38c4694cc4c9599 pypy2.7-v7.2.0-linux64.tar.bz2 -36aa2f2440e762333569118dd0b3d5371d575c40966effa194d116c5453ddb52 pypy2.7-v7.2.0-osx64.tar.bz2 -fb51150a4ce94b0ca8587899ba69c41fc58a6b35c5340ea6926376ecb9cfcac4 pypy2.7-v7.2.0-ppc64.tar.bz2 -5c4224525657c29b815cb2c6b3f9bc5a267368cc6adf0fedb235a6052929f65f pypy2.7-v7.2.0-ppc64le.tar.bz2 -bb7ae585ecb4d904c890e28a2c5b6bd379f57cc3d9e38ff45597ff54fa935eaa pypy2.7-v7.2.0-s390x.tar.bz2 -55cb7757784fbe3952102447f65b27d80e6c885a464a7af1a9ce264492439dcc pypy2.7-v7.2.0-src.tar.bz2 -897038550614d558f9f6718409b107e27903ef2b2b57ec250939d1b1ebdf0aba pypy2.7-v7.2.0-src.zip -956eeaaaac053e5d0917e77a3d2ad1933ab5561eb3e6e71235780b5aa5fd2bb7 pypy2.7-v7.2.0-win32.zip -</pre> -<p>pypy2.7-7.1.1 sha256:</p> -<pre class="literal-block"> -41ca390a76ca0d47b8353a0d6a20d5aab5fad8b0bb647b960d8c33e873d18ef5 pypy2.7-v7.1.1-linux32.tar.bz2 -73b09ef0860eb9ad7997af3030b22909806a273d90786d78420926df53279d66 pypy2.7-v7.1.1-linux64.tar.bz2 -31a17294dec96c2191885c776b4ee02112957dc874f7ba03e570537a77b78c35 pypy2.7-v7.1.1-osx64.tar.bz2 -1ef94c3a9c67c2335cee0b21753036b4696ed588b9d54b7b8036a6ae47f7001d pypy2.7-v7.1.1-s390x.tar.bz2 -5f06bede6d71dce8dfbfe797aab26c8e35cb990e16b826914652dc093ad74451 pypy2.7-v7.1.1-src.tar.bz2 -d9b07a2954ad6dbde94feffd848311e2b5169563d33e3e9f17969579b01a4158 pypy2.7-v7.1.1-src.zip -9c59226311f216a181e70ee7b5aa4d9665a15d00f24ae02acec9af7d96355f63 pypy2.7-v7.1.1-win32.zip -</pre> -<p>pypy2.7-7.1.0 sha256:</p> -<pre class="literal-block"> -44ec91e8cb01caab289d8763c203f3aaf288d14325a6c42692bd1ac4e870d758 pypy2.7-v7.1.0-linux32.tar.bz2 -fef176a29a2ef068c00c8098e59dab935ca6e956f089672b3f7351da95a034f5 pypy2.7-v7.1.0-linux64.tar.bz2 -8be43685ce718b0768387450fc6dc395d60809b778b6146c353ef67826022153 pypy2.7-v7.1.0-osx64.tar.bz2 -b065f55741bcb37863f1eca30ce91c9d79159371a6994100930cdc2ede3237bc pypy2.7-v7.1.0-s390x.tar.bz2 -b051a71ea5b4fa27d0a744b28e6054661adfce8904dcc82500716b5edff5ce4b pypy2.7-v7.1.0-src.tar.bz2 -e60ce30f9947844da43daaa7658adc0c05330681305225954114772f42df06ec pypy2.7-v7.1.0-src.zip -76658c9ad679d562b8b6a09d006caa666406337b9834ff56db16980c5e549f20 pypy2.7-v7.1.0-win32.zip -</pre> -<p>pypy3.6-7.2.0 sha256:</p> -<pre class="literal-block"> -f82dc9dc6c692417ee9727f23beae75364a5757ebdc657a2a1d0010ac3ad17ab pypy3.6-v7.2.0-aarch64.tar.bz2 -45e99de197cb3e974cfc8d45e0076ad2066852e61e56b3eafd1237efafd2c43e pypy3.6-v7.2.0-linux32.tar.bz2 -aa128e555ad0fe5c4c15104ae0903052bd232b6e3a73f5fe023d27b8fd0d6089 pypy3.6-v7.2.0-linux64.tar.bz2 -836abb0ec303b90a684533711ed3b8269d3e8c64805b595e410920abdea678ac pypy3.6-v7.2.0-osx64.tar.bz2 -14021d196e393b3a6d2395ab94ceec347753715e37223efe4c50b7c141b351a2 pypy3.6-v7.2.0-ppc64.tar.bz2 -6aef73a3b68e9a6c062cadd83d3db16790960cf97401ca6f2aad2195e9b05c35 pypy3.6-v7.2.0-ppc64le.tar.bz2 -a11da8118064db102d159e9221319c428b298c4a87f26166fd6ae94be8d6ae0d pypy3.6-v7.2.0-s390x.tar.bz2 -0d7c707df5041f1593fe82f29c40056c21e4d6cb66554bbd66769bd80bcbfafc pypy3.6-v7.2.0-src.tar.bz2 -405ac35695dd374d5ea192cb44cb47231f9a65812cc7b6549df33df12ffe54db pypy3.6-v7.2.0-src.zip -c926f622bec24a8b348591d631717ace83b3a6c3c2dac02b157b622b97d1fc9c pypy3.6-v7.2.0-win32.zip -</pre> -<p>pypy3.6-7.1.1 sha256:</p> -<pre class="literal-block"> -cb11ef4b0df569c28390b1ee93029159e1b90bfbad98df6abd629d5203b2abd9 pypy3.6-v7.1.1-linux32.tar.bz2 -8014f63b1a34b155548852c7bf73aab2d41ebddf2c8fb603dc9dd8509be93db0 pypy3.6-v7.1.1-linux64.tar.bz2 -a5c2f2bfa2b4a4d29e8a67baab95699b169054066df218a14f171bb84a6df0c0 pypy3.6-v7.1.1-osx64.tar.bz2 -4a91bf2d9a142b6dbf82b5301cb510535ae9a54e1645546b2e0735a7b5ed85ba pypy3.6-v7.1.1-s390x.tar.bz2 -6a3ef876e3691a54f4cff045028ec3be94ab9beb2e99f051b83175302c1899a8 pypy3.6-v7.1.1-src.tar.bz2 -4a3ebeb767740f2dc0b886d02797d21d7d69f154cf951bb991c19bd485e6cae1 pypy3.6-v7.1.1-src.zip -8b513b254de5f31890f5956569de9aec3a0a91d7aba72fc89d66901f4a8ccf49 pypy3.6-v7.1.1-win32.zip -</pre> -<p>pypy 3.6-v7.1.0 sha256:</p> -<pre class="literal-block"> -031bfac61210a6e161bace0691b854dc15d01b0e624dc0588c544ee5e1621a83 pypy3.6-v7.1.0-linux32.tar.bz2 -270dd06633cf03337e6f815d7235e790e90dabba6f4b6345c9745121006925fc pypy3.6-v7.1.0-linux64.tar.bz2 -d46e005ba095cb4a7006079ffbf4fe63c18cf5e9d8ce9ce8383efc1a4863ab5b pypy3.6-v7.1.0-osx64.tar.bz2 -243cd0cc188a94c1f064f402ae72b8ba4303eb3137eac53c53826472b8005098 pypy3.6-v7.1.0-s390x.tar.bz2 -faa81f469bb2a7cbd22c64f22d4b4ddc5a1f7c798d43b7919b629b932f9b1c6f pypy3.6-v7.1.0-src.tar.bz2 -4858e7e8a0007bc3b381bd392208b28d30889a4e5a88a3c28e3d9dc4f25b654e pypy3.6-v7.1.0-src.zip -77a0576a3d518210467f0df2d0d9a1892c664566dc02f25d974c2dbc6b4749e7 pypy3.6-v7.1.0-win32.zip -</pre> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/features.html b/features.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_ZmVhdHVyZXMuaHRtbA==..0000000000000000000000000000000000000000 --- a/features.html +++ /dev/null @@ -1,184 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - What is PyPy?</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">What is PyPy?</h1> -<p>PyPy is a replacement for CPython. It is built using the RPython -language that was co-developed with it. The main reason to use it -instead of CPython is speed: it runs generally faster (see next section).</p> -<p><strong>PyPy</strong> implements <strong>Python 2.7.13 and 3.6.9</strong>. -It supports all of the core language, passing the Python 2.7 test suite -and most of the 3.6 test suite (with minor modifications) It supports most of -the commonly used Python standard library modules. For known differences with -CPython, see our <a class="reference external" href="compat.html">compatibility</a> page.</p> -<p>The following CPU architectures are supported and maintained:</p> -<ul class="simple"> -<li><a class="reference external" href="http://en.wikipedia.org/wiki/IA-32">x86 (IA-32)</a> and <a class="reference external" href="http://en.wikipedia.org/wiki/X86_64">x86_64</a></li> -<li><a class="reference external" href="http://en.wikipedia.org/wiki/ARM">ARM</a> platforms (ARMv6 or ARMv7, with VFPv3)</li> -<li><a class="reference external" href="http://en.wikipedia.org/wiki/AArch64">AArch64</a></li> -<li><a class="reference external" href="https://de.wikipedia.org/wiki/PowerPC">PowerPC</a> 64bit both little and big endian</li> -<li><a class="reference external" href="https://de.wikipedia.org/wiki/System/390">System Z (s390x)</a></li> -</ul> -<p>PyPy's x86 version runs on several operating systems, such as Linux -(32/64 bits), Mac OS X (64 bits), Windows (32 bits), OpenBSD, FreeBSD. -All non-x86 versions are only supported on Linux.</p> -<p>If you are interested in helping to move forward, see our <a class="reference external" href="howtohelp.html">howtohelp</a> page.</p> -<div class="section" id="the-main-features-of-pypy"> -<h1>The main features of PyPy:</h1> -</div> -<div class="section" id="speed"> -<h1>Speed</h1> -<p>Our <a class="reference external" href="download.html#with-a-jit-compiler">main executable</a> comes with a Just-in-Time compiler. It is -<a class="reference external" href="http://speed.pypy.org/">really fast</a> in running most benchmarks – including very large and -complicated Python applications, not just 10-liners.</p> -<p>There are two cases that you should be aware where PyPy will <em>not</em> be -able to speed up your code:</p> -<ul class="simple"> -<li>Short-running processes: if it doesn't run for at least a few seconds, -then the JIT compiler won't have enough time to warm up.</li> -<li>If all the time is spent in run-time libraries (i.e. in C functions), -and not actually running Python code, the JIT compiler will not help.</li> -</ul> -<p>So the case where PyPy works best is when executing long-running -programs where a significant fraction of the time is spent executing -Python code. This is the case covered by the majority of <a class="reference external" href="http://speed.pypy.org/">our -benchmarks</a>, but not all of them – the goal of PyPy is to get speed -but still support (ideally) any Python program.</p> -</div> -<div class="section" id="memory-usage"> -<h1>Memory usage</h1> -<p>Memory-hungry Python programs (several hundreds of MBs or more) might -end up taking less space than they do in CPython. It is not always -the case, though, as it depends on a lot of details. Also note that -the baseline is higher than CPython's.</p> -</div> -<div class="section" id="stackless"> -<h1>Stackless</h1> -<p>Support for <a class="reference external" href="http://www.stackless.com/">Stackless</a> and greenlets are now integrated in the normal -PyPy. More detailed information is available <a class="reference external" href="http://doc.pypy.org/en/latest/stackless.html">here</a>.</p> -</div> -<div class="section" id="other-features"> -<h1>Other features</h1> -<p>PyPy has many secondary features and semi-independent -projects. We will mention here:</p> -<ul> -<li><p class="first"><strong>Other languages:</strong> we also implemented other languages that makes -use of our RPython toolchain: <a class="reference external" href="https://bitbucket.org/cfbolz/pyrolog/">Prolog</a> (almost complete), as -well as <a class="reference external" href="https://bitbucket.org/pypy/lang-smalltalk/">Smalltalk</a>, <a class="reference external" href="https://bitbucket.org/pypy/lang-js/">JavaScript</a>, <a class="reference external" href="https://bitbucket.org/pypy/lang-io/">Io</a>, <a class="reference external" href="https://bitbucket.org/pypy/lang-scheme/">Scheme</a> and <a class="reference external" href="https://bitbucket.org/pypy/lang-gameboy/">Gameboy</a>.</p> -<p>There is also a Ruby implementation called <a class="reference external" href="http://topazruby.com/">Topaz</a> and a PHP implementation -called <a class="reference external" href="http://www.hippyvm.com/">HippyVM</a>.</p> -</li> -</ul> -</div> -<div class="section" id="sandboxing"> -<h1>Sandboxing</h1> -<p>PyPy's <em>sandboxing</em> is a working prototype for the idea of running untrusted -user programs. Unlike other sandboxing approaches for Python, PyPy's does not -try to limit language features considered “unsafe”. Instead we replace all -calls to external libraries (C or platform) with a stub that communicates -with an external process handling the policy.</p> -<table class="docutils"> -<colgroup> -<col width="100%" /> -</colgroup> -<tbody valign="top"> -<tr><td><strong>Please be aware that it is a prototype only.</strong> <em>It needs work to become -more complete, and you are welcome to help. In particular, almost none -of the extension modules work (not even</em> <tt class="docutils literal">time</tt> <em>), and</em> <tt class="docutils literal">pypy_interact</tt> -<em>is merely a demo. Also, a more complete system would include a way -to do the same as</em> <tt class="docutils literal">pypy_interact</tt> <em>from other languages than Python, -to embed a sandboxed interpreter inside programs written in other -languages.</em></td> -</tr> -</tbody> -</table> -<p>To run the sandboxed process, you need to get the full sources and -build <tt class="docutils literal"><span class="pre">pypy-sandbox</span></tt> from it (see <a class="reference external" href="download.html#building-from-source">Building from source</a>). These -instructions give you a <tt class="docutils literal"><span class="pre">pypy-c</span></tt> that you should rename to -<tt class="docutils literal"><span class="pre">pypy-sandbox</span></tt> to avoid future confusion. Then run:</p> -<pre class="literal-block"> -cd pypy/sandbox -pypy_interact.py path/to/pypy-sandbox -# don't confuse it with pypy/goal/pyinteractive.py! -</pre> -<p>You get a fully sandboxed interpreter, in its own filesystem hierarchy -(try <tt class="docutils literal"><span class="pre">os.listdir('/')</span></tt>). For example, you would run an untrusted -script as follows:</p> -<pre class="literal-block"> -mkdir virtualtmp -cp untrusted.py virtualtmp/ -pypy_interact.py --tmp=virtualtmp pypy-sandbox /tmp/untrusted.py -</pre> -<p>Note that the path <tt class="docutils literal">/tmp/untrusted.py</tt> is a path inside the sandboxed -filesystem. You don't have to put <tt class="docutils literal">untrusted.py</tt> in the real <tt class="docutils literal">/tmp</tt> -directory at all.</p> -<p>To read more about its features, try <tt class="docutils literal">pypy_interact.py <span class="pre">--help</span></tt> or go to -<a class="reference external" href="http://pypy.readthedocs.org/en/latest/sandbox.html">our documentation site</a>.</p> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/files/favicon2.png b/files/favicon2.png new file mode 100644 index 0000000000000000000000000000000000000000..d147173629864f7e6da122767d521a77265c38f7 GIT binary patch literal 9731 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 Rk23%O002ovPDHLkV1hGG@RR@m diff --git a/howtohelp.html b/howtohelp.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_aG93dG9oZWxwLmh0bWw=..0000000000000000000000000000000000000000 --- a/howtohelp.html +++ /dev/null @@ -1,81 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - How to help?</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">How to help?</h1> -<p>Here are some ideas to help PyPy development:</p> -<ul class="simple"> -<li>use pypy for your projects and provide detailed <a class="reference external" href="contact.html">feedback</a></li> -<li>talk to us about how to support Python 3.x</li> -<li>write blog posts or tweets about your experiences</li> -<li>help porting to new platforms</li> -<li><a class="reference external" href="contact.html">contact</a> us and get involved</li> -<li><a class="reference external" href="http://morepypy.blogspot.com/2010/11/speeding-up-pypy-by-donations.html">donate</a> some money to enable others to help</li> -</ul> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_aW5kZXguaHRtbA==..0000000000000000000000000000000000000000 --- a/index.html +++ /dev/null @@ -1,98 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Welcome to PyPy</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Welcome to PyPy</h1> -<p>PyPy is a <a class="reference external" href="http://speed.pypy.org/">fast</a>, <a class="reference external" href="compat.html">compliant</a> alternative implementation of the <a class="reference external" href="http://python.org/">Python</a> -language (2.7.13 and 3.6.9). It has several advantages and distinct features:</p> -<blockquote> -<ul> -<li><p class="first"><strong>Speed:</strong> thanks to its Just-in-Time compiler, Python programs -often run <a class="reference external" href="http://speed.pypy.org/">faster</a> on PyPy. <a class="reference external" href="http://en.wikipedia.org/wiki/Just-in-time_compilation">(What is a JIT compiler?)</a></p> -<p>“If you want your code to run faster, you should probably just use PyPy.” -— Guido van Rossum (creator of Python)</p> -</li> -<li><p class="first"><strong>Memory usage:</strong> memory-hungry Python programs (several hundreds of -MBs or more) might end up taking <a class="reference external" href="http://morepypy.blogspot.com/2009/10/gc-improvements.html">less space</a> than they do in CPython.</p> -</li> -<li><p class="first"><strong>Compatibility:</strong> PyPy is <a class="reference external" href="compat.html">highly compatible</a> with existing python code. -It supports <a class="reference external" href="https://cffi.readthedocs.org">cffi</a> and can run popular python libraries like <a class="reference external" href="https://twistedmatrix.com/">twisted</a> -and <a class="reference external" href="https://www.djangoproject.com/">django</a>.</p> -</li> -<li><p class="first"><strong>Stackless:</strong> PyPy comes by default with support for <a class="reference external" href="features.html#stackless">stackless mode</a>, -providing micro-threads for massive concurrency.</p> -</li> -<li><p class="first">As well as other <a class="reference external" href="features.html">features</a>.</p> -</li> -</ul> -</blockquote> -<p class="download"><a class="reference external" href="download.html">Download and try out PyPy</a></p> -<p>Want to know more? A good place to start is our detailed <a class="reference external" href="http://speed.pypy.org/">speed</a> and -<a class="reference external" href="compat.html">compatibility</a> reports!</p> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/numpydonate.html b/numpydonate.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_bnVtcHlkb25hdGUuaHRtbA==..0000000000000000000000000000000000000000 --- a/numpydonate.html +++ /dev/null @@ -1,232 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Call for donations - PyPy to support Numpy!</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Call for donations - PyPy to support Numpy!</h1> -<p>UPDATE (Febuary 2016):</p> -<blockquote> -<em>We have closed this campaign. We have achieved most of the goals -of the orignal work plan while raising most of the funds. Work -will continue to make Numpy and the rest of the numeric stack more -usable on PyPy.</em></blockquote> -<p>UPDATE (May 2014):</p> -<blockquote> -<em>Thanks to our donors, we have raised 80% of -the total so far. Work on this topic has been happening, and -continues to happen, within the budget – even if not within the -timeline described below. We have simply not found enough time to -work on it as much as we wanted, and thus did not consume the money as -quickly as predicted. The ratio “progress / $ used” so far -corresponds roughly to what we expected. The document below is the -original call for proposal, and we still accept donations for this -topic. See the</em> <a class="reference external" href="http://morepypy.blogspot.com/search/label/numpy">latest status reports</a> <em>on our blog for updates. -There is also an automatically generated</em> <a class="reference external" href="http://buildbot.pypy.org/numpy-status/latest.html">coverage dashboard</a> <em>showing -what parts of NumPy are already usable.</em></blockquote> -<p>This is a proposal to provide a fully compatible working <a class="reference external" href="http://numpy.scipy.org/">NumPy</a> implementation -for PyPy. This has long be en a very commonly <a class="reference external" href="http://morepypy.blogspot.com/2011/06/report-back-from-our-survey.html">requested feature</a> for PyPy -as well as a worthy goal given that PyPy performs extremely well on numeric -workloads.</p> -<p>We already had some success providing a very basic <a class="reference external" href="http://morepypy.blogspot.com/2011/05/numpy-in-pypy-status-and-roadmap.html">NumPy implementation</a>, -however we believe that raising funds can significantly speed up its -development, by paying people to work full time on it.</p> -<p>Below you'll find the <a class="reference internal" href="#work-plan">work plan</a> and the associated -fundraising targets we need to make things happen. Once we reach the -necessary target for each stage, we will start contracting -developers. Contracts and money are managed by the non-profit -<a class="reference external" href="http://sfconservancy.org/">Software Freedom Conservancy</a> of which the PyPy project is a member. -The current elected representatives are Carl Friedrich Bolz, Holger -Krekel and Jacob Hallen and they will – in close collaboration with -Conservancy and the core developers – select the best developers for -implementing NumPy among well known PyPy contributors.</p> -<p>Should we not receive enough donations to complete all stages by 1st March 2012 -at the latest, we will try our best to make PyPy support NumPy anyway. We -however reserve the right to shift any unused funds to other PyPy activities -when that date is reached. Of course, since the Conservancy is a -501(c)(3) charitable organization incorporated in NY, USA, all funds will, -regardless of their use, be spent in a way that benefits the general -public, the advancement of Open Source and Free Software, -and in particular the PyPy community and the PyPy codebase.</p> -<p><strong>Note</strong> For donations higher than $1,000, we can arrange for an invoice -and a different payment method to avoid the high Paypal fees. Please -contact pypy at sfconservancy.org if you want to know details on how -to donate via other means.</p> -<div class="section" id="what-is-numpy"> -<h1>What is NumPy?</h1> -<p><a class="reference external" href="http://numpy.scipy.org/">NumPy</a> is a framework for doing numerical calculations in Python. It has -become the de-facto standard for doing any kinds of computations that involve -n-dimensional arrays. Please consult the NumPy website for more details.</p> -</div> -<div class="section" id="why-does-numpy-on-pypy-make-sense"> -<h1>Why does NumPy on PyPy make sense?</h1> -<p>NumPy on PyPy makes sense for a couple of reasons: Firstly, it is by -far the most requested feature from PyPy. Secondly, PyPy <a class="reference external" href="http://morepypy.blogspot.com/2011/07/realtime-image-processing-in-python.html">performs -well</a> on numerical loads already. Therefore bringing NumPy into the -equation is a reasonable next step - as it's a very convenient and popular tool -for doing this kind of work. The resulting implementation should move -Python in scientific world from being a merely “glue” language into -being the main implementation language for a lot of people in -the scientific/numeric worlds. This will benefit current users of NumPy as -well as people who so far have to cope with lower level languages like C -or Fortran for speed purposes.</p> -</div> -<div class="section" id="speed"> -<h1>Speed</h1> -<p>The current implementation of NumPy on PyPy is reasonably fast - it ranges -from roughly the same speed to 2-5x faster for stacked large array operations -to 100-300x for accessing NumPy array elements one by one. The exact speed -depends very much how NumPy is used, but the target would be to be within an -order of magnitude from handwritten C. -To achieve this, we would -need to teach our JIT backends how to use modern vector instructions, like SSE -or AVX. Hence, we split the proposal into two parts, first part covers compatibility -with a reasonable approach to keeping current speed achievements, second part -is about teaching the JIT how to vectorize certain operations, which should bring -PyPy's NumPy as a very competitive tool compared to other available -solutions for numerical computations, like matlab or C++ array libraries.</p> -<div class="section" id="id1"> -<span id="work-plan"></span><h2>Work plan</h2> -</div> -</div> -<div class="section" id="about-estimates-and-costs"> -<h1>About estimates and costs</h1> -<p>For each step, we estimated the time that it would take to complete for an -experienced developer who is already familiar with the PyPy codebase. From -this number, the money is calculated considering an hourly rate of $60, and a -5% general donation which goes to the <a class="reference external" href="http://sfconservancy.org/">Software Freedom Conservancy</a> itself, the non-profit -organization of which the PyPy project is a member and which manages all the -issues related to donations, payments, and tax-exempt status.</p> -<p>We split the proposal into two parts - we plan to implement them in the same -order, starting by the time we raise the corresponding funding targets:</p> -<ul> -<li><p class="first"><strong>Compatibility</strong>:</p> -<p>This part covers the core NumPy Python API. We'll implement all NumPy APIs -that are officially documented and we'll pass all of NumPy's tests that -cover documented APIs and are not implementation details. -Specifically, we don't plan to:</p> -<ul class="simple"> -<li>implement NumPy's C API</li> -<li>implement other scientific libraries, like SciPy, matplotlib or biopython</li> -</ul> -<p>Estimated costs: USD$30,000. Estimated duration: 3 months.</p> -</li> -<li><p class="first"><strong>Speed</strong>:</p> -<p>This part will cover significant speed improvements in the JIT that would -make numeric computations faster. This includes, but is not necesarilly -limited to:</p> -<ul class="simple"> -<li>write a set of benchmarks covering various use cases</li> -<li>teaching the JIT backend (or multiple backends) how to deal with vector -operations, like SSE</li> -<li>experiments with automatic parallelization using multiple threads, akin -to numexpr</li> -<li>improving the JIT register allocator that will make a difference, especially -for tight loops</li> -</ul> -<p>As with all speed improvements, it's relatively hard to predict exactly -how it'll cope, however we expect the results to be within an order -of magnitude of handwritten C equivalent.</p> -<p>Estimated costs: USD$30,000. Estimated duration: 3 months.</p> -</li> -</ul> -<div class="section" id="benefits-of-this-work-to-the-python-community-and-the-general-public"> -<h2>Benefits of This Work to the Python Community and the General Public</h2> -<p>Python has become one of the most popular dynamic programming languages in -the world. Web developers, educators, and scientific programmers alike -all value Python because Python code is often more readable and because -Python often increases programmer productivity.</p> -<p>Traditionally, languages like Python ran more slowly than static, compiled -languages; Python developers chose to sacrifice execution speed for ease -of programming. The PyPy project created a substantially improved Python -language implementation, including a fast Just-in-time (JIT) compiler. -The increased execution speed that PyPy provides has attracted many users, -who now find their Python code runs up to four times faster under PyPy -than under the reference implementation written in C.</p> -<p>Meanwhile, adoption of Python is already underway for those researchers -and developers who work specifically on computing that requires fast -numeric operations. Numpy support in PyPy will allow for Python's use by -those developers and researchers who want the ease of programming that -Python provides, the speed of PyPy, <em>and</em> the speedups for numerical work -that Numpy can provide.</p> -<p>PyPy's developers make all PyPy software available to the public without -charge, under PyPy's Open Source copyright license, the permissive MIT -License. PyPy's license assures that PyPy is equally available to -everyone freely on terms that allow both non-commercial and commercial -activity. This license allows for academics, for-profit software -developers, volunteers and enthusiasts alike to collaborate together to -make a better Python implementation for everyone.</p> -<p>NumPy support for PyPy will be licensed similarly, and therefore NumPy -support can directly help researchers and developers who seek to do -numeric computing but want an easier programming language to use than -Fortan or C, which is typically used for these applications. Being -licensed freely to the general public means that opportunities to use, -improve and learn about how NumPy works itself will be generally available -to everyone.</p> -</div> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/people.html b/people.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_cGVvcGxlLmh0bWw=..0000000000000000000000000000000000000000 --- a/people.html +++ /dev/null @@ -1,190 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - People of PyPy</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">People of PyPy</h1> -<div class="section" id="armin-rigo"> -<h1>Armin Rigo</h1> -<img alt="image/people/arigo.png" src="image/people/arigo.png" /> -<p>Armin Rigo is a former researcher at the Heinrich-Heine Universitat -Düsseldorf (Germany). He studied Mathematics at the University -of Lausanne (Switzerland), obtained his Ph.D. in Logic and Set -Theory at the Free University of Brussels (Belgium) in 2002, and -worked at the University of Southampton (UK) until 2005. He is -the author of Psyco, the first just-in-time compiler for Python. -He is one of the founders and lead developers of the PyPy project -which began in 2003. He has taken part in all areas, from the Python -language definition to the RPython translation framework, -including the garbage collector and the tracing just-in-time -compiler.</p> -</div> -<div class="section" id="maciej-fijalkowski"> -<h1>Maciej FijaÅ‚kowski</h1> -<img alt="image/people/fijal_thumb.png" src="image/people/fijal_thumb.png" /> -<p>Maciej is a freelancer working mostly on PyPy for the past several years. -He's a core developer since 2006, working on all kinds of parts in -the entire codebase including JIT, GC and assembler backends. -Maciej has been going to many conferences, advertising PyPy to a broader -audience for the past several years, including a keynote at Pycon 2010. -He's also the main maintainer of -<a class="reference external" href="https://bitbucket.org/pypy/jitviewer">jitviewer</a>, a tool for analyzing performance of your python programs under -PyPy.</p> -</div> -<div class="section" id="carl-friedrich-bolz"> -<h1>Carl Friedrich Bolz</h1> -<img alt="image/people/cfbolz.jpg" src="image/people/cfbolz.jpg" /> -<p>Carl Friedrich is a core developer since 2005, currently doing his PhD at the -Heinrich-Heine Universität Düsseldorf (Germany). He has worked on most aspects -of PyPy, from the core interpreter to the GC to the JIT. He has published -several papers about the inner workings of PyPy, presenting them at various -scientific conferences. Carl Friedrich is also interested in other dynamic -language implementation and was the original author of the Prolog -implementation.</p> -<p>Carl Friedrich likes science fiction novels and sometimes plays the bassoon.</p> -</div> -<div class="section" id="antonio-cuni"> -<h1>Antonio Cuni</h1> -<img alt="image/people/antocuni.png" src="image/people/antocuni.png" /> -<p>Antonio Cuni loves skiing, mountains and programming languages. He studied -Computer Science at the University of Genova (Italy), and then at the same -university he obtained his Ph.D. in Computer Science in 2010, with a -dissertation about the PyPy CLI JIT backend. He has been a core PyPy -developer since 2006, working in various areas including the “object oriented -backends” for the CLI and JVM, the RPython translation framework, the Python -interpreter and the JIT compiler generator. Apart from PyPy, he is the author of -other popular tools such as <tt class="docutils literal">pdb++</tt>.</p> -</div> -<div class="section" id="benjamin-peterson"> -<h1>Benjamin Peterson</h1> -<p>Both a PyPy and CPython core developer, Benjamin knows way too much about the -nooks and cranies of the Python language. He is driven by a fascination with -interpreters and compilers of all shapes and sizes. Around the PyPy project, he -tries to be generally useful and has taken on major projects including rewriting -PyPy's Python compiler and porting PyPy to Python 2.7.</p> -</div> -<div class="section" id="alex-gaynor"> -<h1>Alex Gaynor</h1> -<img alt="image/people/alex.jpg" src="image/people/alex.jpg" /> -<p>Alex is software engineer living in Washington, DC. He's been a PyPy developer -since 2010, and has worked on many parts of the codebase, including the JIT -compiler's optimizers, the RPython translation toolchain, and the Python -interpreter. In addition to his work on PyPy, Alex is also the creator of -Topaz, a Ruby VM built on RPython and a core developer of Django (a Python web -framework) and CPython, as well as a retired member of the board of directors -of the Python Software Foundation.</p> -</div> -<div class="section" id="hakan-ardo"> -<h1>HÃ¥kan Ardö</h1> -<img alt="image/people/hakanardo.jpg" src="image/people/hakanardo.jpg" /> -<p>HÃ¥kan Ardö received his master of science degree in electrical -engineering from Lund University in 2002. He specialized in -VLSI-design and Image Processing. He worked as a software -engineer at Axis Communications 2002-2003 before doing his -PhD at the Centre for Mathematical Sciences of Lund University -2003-2009 in the Mathematical Imaging Group. His thesis work consisted -of designing image processing algorithms for traffic surveillance, -aiming for a system that automatically measures the safety of an -intersection or road segment. He is currently working part-time as a -postdoc at the Centre for Mathematical Sciences of Lund University -continuing this work and part-time as CTO with a spinoff company -Cognimatics. His contributions to PyPy started 2010 and consists of -the array module as well as work on the JIT compiler's trace optimizers.</p> -</div> -<div class="section" id="holger-krekel"> -<h1>Holger Krekel</h1> -<img alt="image/people/holger1.jpg" src="image/people/holger1.jpg" /> -<p>Holger Krekel is a founder of the PyPy project and has participated in -PyPy core developement for several years as well as maintained much of -its infrastructure. He also is the author of the popular <a class="reference external" href="http://pytest.org">py.test</a> and -<a class="reference external" href="http://codespeak.net/tox">tox</a> testing tools as well as <a class="reference external" href="http://codespeak.net/execnet">execnet</a>, a library for easily deploying -different interacting Python interpreters side by side. He helped -manage multiple PyPy funding contracts through his company merlinux and is a -PyPy representative within the Software Freedom Conservancy (SFC). He -holds a summa cum laude degree in computer science with a thesis about -artificial intelligence applied to the game of Go. As of 2011 he is on -another sabbatical-ish leave, caring for his newborn son, travelling -and pondering what comes next. Other than that he continues to care -for testing and some PyPy co-ordination bits behind the scene.</p> -</div> -<div class="section" id="samuele-pedroni"> -<h1>Samuele Pedroni</h1> -<p>Samuele Pedroni got involved with PyPy almost at its inception in the -spring of 2003. One of the design contributors to PyPy, his help has -ranged from infrastructure and processes, through building out -RPython… optimizing the Python interpreter, to compressing resume -data in the last incarnation of the JIT compiler. Tempted away into the -application side of the software equation, these days he contributes -some words and wisdom to PyPy's paper writing.</p> -</div> -<div class="section" id="many-more-people"> -<h1>Many more people</h1> -<p>PyPy is and has always been an effort of many volunteers. Consult the <a class="reference external" href="https://bitbucket.org/pypy/pypy/src/tip/LICENSE">LICENSE</a> -file for details.</p> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/performance.html b/performance.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_cGVyZm9ybWFuY2UuaHRtbA==..0000000000000000000000000000000000000000 --- a/performance.html +++ /dev/null @@ -1,371 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Performance</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Performance</h1> -<div class="contents topic" id="contents"> -<p class="topic-title first">Contents</p> -<ul class="simple"> -<li><a class="reference internal" href="#profiling-vmprof" id="id1">Profiling: vmprof</a></li> -<li><a class="reference internal" href="#optimization-strategy" id="id2">Optimization strategy</a></li> -<li><a class="reference internal" href="#micro-tuning-tips" id="id3">Micro-tuning tips</a></li> -<li><a class="reference internal" href="#insider-s-point-of-view" id="id4">Insider's point of view</a></li> -</ul> -</div> -<p>This document collects strategies, tactics and tricks for making your -code run faster under PyPy. Many of these are also useful hints for -stock Python and other languages. For contrast, we also describe some -CPython (stock Python) optimizations that are not needed in PyPy.</p> -<hr class="docutils" /> -<div class="section" id="profiling-vmprof"> -<span id="profiling"></span><span id="profiler"></span><h1><a class="toc-backref" href="#id1">Profiling: vmprof</a></h1> -<p>As a general rule, when considering performance issues, follow these -three points: first <em>measure</em> them (it is counter-productive to fight -imaginary performance issues); then <em>profile</em> your code (it is useless -to optimize the wrong parts). Only optimize then.</p> -<p>PyPy 2.6 introduced <a class="reference external" href="https://vmprof.readthedocs.org/">vmprof</a>, a very-low-overhead statistical profiler. -The standard, non-statistical <tt class="docutils literal">cProfile</tt> is also supported, and can be -enabled without turning off the JIT. We do recommend vmprof anyway -because turning on cProfile can distort the result (sometimes massively, -though hopefully this should not be too common).</p> -</div> -<hr class="docutils" /> -<div class="section" id="optimization-strategy"> -<h1><a class="toc-backref" href="#id2">Optimization strategy</a></h1> -<p>These suggestions apply to all computer languages. They're here as -reminders of things to try before any Python or PyPy-specific tweaking.</p> -<div class="section" id="build-a-regression-test-suite"> -<h2>Build a regression-test suite</h2> -<p>Before you start tuning, build a regression-test suite for your code. -This front-loads a significant amount of work, but it means you can -try lots of optimizations without worrying so much about introducing -functional bugs.</p> -</div> -<div class="section" id="measure-don-t-guess"> -<h2>Measure, don't guess</h2> -<p>Human beings are bad at guessing or intuiting where the hotspots in code are. -Measure, don't guess; use a <a class="reference internal" href="#profiler">profiler</a> to pin down the 20% of the -code where the code is spending 80% of its time, then speed-tune that.</p> -<p>Measuring will save you a lot of effort wasted on tuning parts of the code -that aren't actually bottlenecks.</p> -<p>As you tune, re-profile frequently so you can see how the hottest spots -are shifting around.</p> -</div> -<div class="section" id="i-o-bound-is-different-from-compute-bound"> -<h2>I/O-bound is different from compute-bound</h2> -<p>Be aware of the difference between code that is compute-bound (slow -because it's doing a huge number of instructions) and code that is I/O -bound (slow because of disk or network delays).</p> -<p>Expect to get most of your gains from optimizing compute-bound code. -It's usually (though not always) a sign that you're near the end of -worthwhile tuning when <a class="reference internal" href="#profiling">profiling</a> shows that the bulk of the -application's time is spent on network and disk I/O.</p> -</div> -<div class="section" id="tune-your-algorithms-first"> -<h2>Tune your algorithms first</h2> -<p>Generally, when your code is doing things that are O(n**2) or larger -in the size of your data set, the cost of those operations is going -to swamp any small gains you can pick up with the tricks we describe -here.</p> -<p>Tune your algorithms first. It's time to think about applying our -list of micro-tuning tips <em>after</em> you think you've optimized out -intrinsically expensive operations.</p> -<p>That said, be prepared for the possibility that you will discover -better-hidden algorithmic problems as you micro-tune. Likely -you will go through this cycle more than once.</p> -</div> -<div class="section" id="focus-on-tight-loops"> -<h2>Focus on tight loops</h2> -<p>It's extremely common for high time costs to lurk within some -innocuous-looking code inside a tight loop - especially in code -that does something like a searching/matching/lookup operation -or any kind of graph traversal.</p> -<p>Probably the most common kind of performance-killer in compute-bound -code is an O(n**2) operation that is disguised by being some sort of -O(n) lookup or match inside an O(n) loop.</p> -<p>Another common time-sink is relatively expensive common-setup -operations that are performed inside tight loops but could be moved -to before they start. (For a representative case of this, see the -micro-tuning tip on regexp compilation.)</p> -</div> -<div class="section" id="smaller-is-faster"> -<h2>Smaller is faster</h2> -<p>Modern computers have multiple levels of memory caching, some directly -on the processor chip. Causing a cache miss at any level incurs a -performance penalty proportional to random-access time for the next -outward (and much slower) layer of cache.</p> -<p>Accordingly, smaller is faster. Programs or routines with a small -enough working set to fit inside a fast cache will be as fast as -that cache is. To make your code fast, reduce the length of the -series of Python or JIT-compiler opcodes it generates by making -it simpler.</p> -<p>The tradeoff here is that algorithmic tuning often trades time for -space - that is, it increases the size of an algorithm's working set -by including pre-computations or tables or reverse maps in order to -avoid O(n**2) operations.</p> -<p>It's impossible to predict in advance where the sweet spot in that -tradeoff will be. You have to try different things and measure - -which takes us right back to “Measure, don't guess”. And another -function of your regression test suite can be as a speed benchmark.</p> -</div> -</div> -<hr class="docutils" /> -<div class="section" id="micro-tuning-tips"> -<h1><a class="toc-backref" href="#id3">Micro-tuning tips</a></h1> -<p>These are in no particular order.</p> -<div class="section" id="keep-it-simple"> -<h2>Keep it simple</h2> -<p>Simple is better than complex. The PyPy JIT is not very smart; the -simpler your code is the better it will run. Here again, though, you face -a tradeoff: you may need to pay with more algorithmic complexity in order -to avoid brute-force operations that are O(n**2) or worse.</p> -<p>Write plain-vanilla code in plain-vanilla ways. The PyPy JIT has many -productions that optimize a common usage pattern against an uncommon -usage pattern.</p> -</div> -<div class="section" id="global-variables"> -<h2>Global variables</h2> -<p>In CPython, global variables and functions (including package imports) -are much more expensive to reference than locals; avoid them. (This -is also good modularity practice).</p> -<p>The cost of CPython global references is high enough that, for example, if you -have code in a frequently-visited inner loop that uses int() a lot, it -may be worthwhile to create a local copy of the reference with “int = -int” in an enclosing block.</p> -<p>However, this in <em>not</em> true in JITted PyPy code. The “int = int” hack -won't buy you performance, it's just an extra copy. The modularity -reason for avoiding globals are still valid.</p> -</div> -<div class="section" id="regular-expressions"> -<h2>Regular expressions</h2> -<p>Regular-expression compilation is expensive. If the regexp pattern in -a search, match, or replace operation is static (doesn't mutate at -runtime) refactor so it's only done once.</p> -<p>If the regexp compilation is in a class method, consider doing it as -the initializer of a regexp-valued static (shared) class member and -using that class member in your operation.</p> -<p>If the regexp compilation is in a free function, consider moving it -to module level and referencing the resulting regexp object -(but see the warning above about global variables).</p> -</div> -<div class="section" id="old-vs-new-style-classes"> -<h2>Old- vs. new-style classes</h2> -<p>New-style classes allow faster attribute access and take up less core -per instance than old-style classes. Much of this advantage may be -lost, however, if attribute names are not constant. For example: x.a -= y or even setattr(x, ‘a’, y) will be much faster than a dynamic -version: setattr(x, ‘a’ + some_variable, y).</p> -<p>Classes that inherit from both new- and old-style classes are -<em>extremely</em> slow; avoid at all costs.</p> -<p>In PyPy, isinstance() called against an old-style class was very slow -until 2.0.</p> -</div> -<div class="section" id="string-concatenation-is-expensive"> -<h2>String concatenation is expensive</h2> -<p>In CPython, you may want to replace:</p> -<pre class="literal-block"> -s = head + body + maybe + tail -</pre> -<p>with the admittedly less readable:</p> -<pre class="literal-block"> -s = "%(head)s%(body)s%(maybe)s%(tail)s" % locals() -</pre> -<p>or even:</p> -<pre class="literal-block"> -s = "{head}{body}{maybe}{tail}".format(**locals()) -</pre> -<p>Both of the latter forms avoid multiple-allocation overhead. -But PyPy's JIT makes the overhead of intermediate concatenations -go away in linear code that keeps the number of concatenations -small, bound and constant. (And <tt class="docutils literal">locals()</tt> is rather slow -with PyPy's JIT.)</p> -<p>On the other hand, in code like this with a string-valued foo() function:</p> -<pre class="literal-block"> -for x in mylist: - s += foo(x) -</pre> -<p>the JIT cannot optimize out intermediate copies. This code is -actually quadratic in the total size of the mylist strings due to -repeated string copies of ever-larger prefix segments. (Such code -is always fine for bytearrays, because in this case <tt class="docutils literal">+=</tt> is an -in-place operation.)</p> -<p>This:</p> -<pre class="literal-block"> -parts = [] -for x in mylist: - parts.append(foo(x)) -s = "".join(parts) -</pre> -<p>can be much faster because all the string concatenation in the last -line creates exactly one new string object with one C-level copy -sequence (and list operations are relatively cheap).</p> -</div> -<div class="section" id="frame-introspection-and-tracing-are-slow"> -<h2>Frame introspection and tracing are slow</h2> -<p>Certain function calls can disable PyPy's speed options over -stretches of surrounding code called “JIT scopes”.</p> -<p>A JIT like PyPy's works based on the assumption that the only thing -worth optimizing are loops that are executed often. Whenever the -interpreter enters a loop in the interpreted program, the JIT records -what the interpreter does, creating a trace. This trace is optimized, -compiled to machine code and executed when the loop is hit with the -conditions observed during tracing. This trace is one kind of JIT scope.</p> -<p>Another kind of JIT scope that matters is a function, considered as -a unit for inlining.</p> -<p>Note that a JIT scope is a run-time phenomenon, not a compile-time -one. It's not confined by source-code module boundaries. A library- -or foreign-module call in a frequently-called loop or inlined function -will be part of its JIT scope.</p> -<p>locals(), globals(), sys._getframe(), sys.exc_info(), and sys.settrace -work in PyPy, but they incur a performance penalty that can be huge by -disabling the JIT over the enclosing JIT scope.</p> -<p><em>(Thanks Eric S. Raymond for the text above)</em></p> -</div> -</div> -<hr class="docutils" /> -<div class="section" id="insider-s-point-of-view"> -<h1><a class="toc-backref" href="#id4">Insider's point of view</a></h1> -<p>This section describes performance issues from the point of view of -insiders of the project; it should be particularly interesting if you -plan to contribute in that area.</p> -<p>One of the goals of the PyPy project is to provide a fast and compliant -python interpreter. Some of the ways we achieve this are by providing a -high-performance garbage collector (GC) and a high-performance -Just-in-Time compiler (JIT). Results of comparing PyPy and CPython can -be found on the <a class="reference external" href="http://speed.pypy.org">speed website</a>. Those benchmarks are not a random -collection: they are a combination of real-world Python programs – -benchmarks originally included with the (now dead) Unladen Swallow -project – and benchmarks for which we found PyPy to be slow (and improved). -Consult the descriptions of each for details.</p> -<p>The JIT, however, is not a magic bullet. There are several characteristics -that might surprise people who are not used to JITs in -general or to the PyPy JIT in particular. The JIT is generally good at -speeding up straight-forward Python code that spends a lot of time in the -bytecode dispatch loop, i.e., running actual Python code – as opposed -to running things that only are invoked by Python code. Good -examples include numeric calculations or any kind of heavily -object-oriented program. Bad examples include doing computations with -large longs – which is performed by unoptimizable support code. When the -JIT cannot help, PyPy is generally slower than CPython.</p> -<p>More specifically, the JIT is known not to work on:</p> -<ul class="simple"> -<li><strong>Tests</strong>: The ideal unit tests execute each piece of tested code -once. This leaves no time for the JIT to warm up.</li> -<li><strong>Really short-running scripts</strong>: A rule of thumb is if something runs below -0.2s the JIT has no chance, but it depends a lot on the program in question. -In general, make sure you warm up your program before running benchmarks, if -you're measuring something long-running like a server. The time required -to warm up the JIT varies; give it at least a couple of seconds. (PyPy's -JIT takes an especially long time to warm up.)</li> -<li><strong>Long-running runtime functions</strong>: These are the functions provided -by the runtime of PyPy that do a significant amount of work. -PyPy's runtime is generally not as optimized as CPython's and we expect those -functions to take somewhere between the same time as CPython to twice as long. -This includes, for example, computing with longs, or sorting large lists. -A counterexample is regular expressions: although they take time, they -come with their own JIT.</li> -</ul> -<p>Unrelated things that we know PyPy to be slow at (note that we're probably -working on it):</p> -<ul class="simple"> -<li><strong>CPython C extension modules</strong>: Any C extension module recompiled -with PyPy takes a very large hit in performance. PyPy supports C -extension modules solely to provide basic functionality. -If the extension module is for speedup purposes only, then it -makes no sense to use it with PyPy at the moment. Instead, remove it -and use a native Python implementation, which also allows opportunities -for JIT optimization. If the extension module is -both performance-critical and an interface to some C library, then it -might be worthwhile to consider rewriting it as a pure Python version -that uses <a class="reference external" href="http://cffi.readthedocs.org/">CFFI</a> for the interface.</li> -<li><strong>Missing RPython modules</strong>: A few modules of the standard library -(like <tt class="docutils literal">csv</tt> and <tt class="docutils literal">cPickle</tt>) are written in C in CPython, but written -natively in pure Python in PyPy. Sometimes the JIT is able to do a -good job on them, and sometimes not. In most cases (like <tt class="docutils literal">csv</tt> and -<tt class="docutils literal">cPickle</tt>), we're slower than CPython, with the notable exception of -<tt class="docutils literal">json</tt> and <tt class="docutils literal">heapq</tt>.</li> -<li><strong>Abuse of itertools</strong>: The itertools module is often “abused” in the -sense that it is used for the wrong purposes. From our point of view, -itertools is great if you have iterations over millions of items, but -not for most other cases. It gives you 3 lines in functional style -that replace 10 lines of Python loops (longer but arguably much easier -to read). The pure Python version is generally not slower even on -CPython, and on PyPy it allows the JIT to work much better – simple -Python code is fast. The same argument also applies to <tt class="docutils literal">filter()</tt>, -<tt class="docutils literal">reduce()</tt>, and to some extend <tt class="docutils literal">map()</tt> (although the simple case -is JITted), and to all usages of the <tt class="docutils literal">operator</tt> module we can think -of.</li> -<li><strong>Ctypes</strong>: Ctypes is slower than on CPython. Consider <a class="reference external" href="http://cffi.readthedocs.org/">CFFI</a> instead, -which has special paths inside the JIT.</li> -</ul> -<p>We generally consider things that are slower on PyPy than CPython to be bugs -of PyPy. If you find some issue that is not documented here, -please report it to our <a class="reference external" href="https://bitbucket.org/pypy/pypy/issues?status=new&status=open">bug tracker</a> for investigation.</p> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/public/favicon2.png b/public/favicon2.png new file mode 100644 index 0000000000000000000000000000000000000000..d147173629864f7e6da122767d521a77265c38f7 GIT binary patch literal 9731 zc$@(PCj8lnP)<h;3K|Lk000e1NJLTq005`}006590ssI2eZ4?U00009a7bBm000fw z000fw0YWI7cmMzZ2XskIMF->p2@oDKMtLIf001BWNkl<Zc-rlqXLMWFo#5}Q=p;yh zy^CE`r9?Fs%CcOfxW$R%9@}F@Imu=+nMvmCnLWE_vmf?k_UxWb&P=kKnN8xEiR~nl z=EQPhTXrH#wk4}k6eY@RVkZFtAo{~=_ul;g5rR-29;(>>A9x-f0OA3^f4}7s7-O)8 zWp=?aHaWfEa{K%NQ4%Fdq9}@?>Ea?&ZB@nA_BMlFw<^Clu{OcaE;v8FaB0Eml4S{F zjG_c%3?W1aK?pHII=#NDz3srhT}Hir9sCNG@tL_3pPc7;KFk|Jr~p2E20{n`Xm4rx z+~NC+jD~gaD?lV!Uhp^^i*A?46X1dlryoiPFNu2a;lCtF9lZO_2YT;V2fvI2W9;&} zMyIEyZ7yDrpbQbhBp||1g^5OZX9hm}x4y3KFJF32!?Nq(Z<_>pZr(ZP@_46h?hq%D z1VIotNXKB#A$SO(!D#r;fAzH$?e<q5cp1vmj%knIC(FR@@Ou3rnxw+80RRZ00)U4Q zk`!^@fvt^obsbHcb()o@0rX0_P*D;mY!d;FqbL>tFgfGqd6}jtmS!Tn3z|KM@>_48 zKlC6XC_WSvC`#MWxTVNcvTpIY5rokA{J6*OrzwUcNm+)YQ+A99iX_8V9x?O+TRenN zmSuo(?>(Elw=@9&Fv5IDW@vp^OSgvAu7l4|yaDfoZ3;m^(>L7Gyu-cd39&RCL3`W5 zLkJOs+qzrsKd?1&<xobVh$^l14OOk{;M0)lh3N&ii>0*y+_<)oAdOAhwX7y`waW*5 z_<T!S?Gumfjrk%1FKadCP0iimlye<?(t2!kX4D@FF%%Ph-s$l>oB?LZ(3c_juvArB zUwrNWO;a)73(AN9+KtUSSeji2A1h<C*F6D${7*A6>yV{elw;X~mu0!Q#B}tf2aLu9 z?R_X?0<c{zJuzy%cEL}~Pq=*Egw`-JVWUVU!g%?EhY)IYnj?R4sIuIg@XJCO)0AOT z^UmAu{K?z+*`9#=!q6o@7mBBjF}^l7N0AIzX%g@U|M3UE9U7TS_$);enBXoAe=s)l z=~@IY%F?Bg%Tsn6OKTFo;M1{r4Wn71O)-HNe)N+!&-INYdjUlgLBW1;=mWRkwT8e? zElgb*y+)BtGG{k3Vb`!LmHLhLq9nie>N|gU_ncDij0RKoD_2I(-j--vQ1Br!bm7xJ zk1xnDNqzXltb?W)u<`{$c<jwnKmND3l`<>>AR=^m<dnlZziPqH*k`VdkFbnZA+2$` z{Ron)X~6Kz$Nm5NAASX8rH(Q|;d$rC)v<Gh{NjZGj}Yn~z3lS&7+T4cB^f&1+%oKS zWGMrehyLq-e}xMP%1QzOH!${*Kj>K{;C(@F-^gW>U`R3r(a{N;hGD>Jl!@!p|K-2^ zSP-RD#WkFmzdU6dUGd;&7G_3gCX=P^(K0>n(rQ-cw8pT^PS1Vkf4-VJIuO_soV_}6 z9s|5m!4HlPrgZN&a$p&9oCH?8T)8~-<{wY1OALco#y){aUSZ%dz!!)6WJr+e0`}PS z0=vRzGO3i;U;l&87gYBf3WMXH1bF|70WZnY`D+(xQgdtPG^zLk97C-M>HvTc7y9?# zoKS5)^7w4O-7~iWzzZUOY2=EANh4a%+P$kUlUI-vADmM^UkC%Z;2N8AOfGBioDjS` zb}g+|t2YqRGAvk2;#u^3Ix?M3+(a(l)bzsjWePsX2M5Q8(`~TN+dW_{nfr~({%U#@ zF+d*w?4)gY*?|x8fol^ZYRa}-JOnSU^qzc%W&L>CVH*SF<Lp!Rv1J5akc7eU;S8pi z%-Y?=+B0_mfGA~Br(ukI!TGs`iDdy^l*P-VS2ax9lS&c70Fz){()!UbTnx<ETr=7K ztE}eLV~qQU2Utd%!RW%QeUYK*waKr#(wYr>r+1RoXiAM`x6R@&4)?K4h7-txoVaEU zx22^vJG+<X9U~!;yFK8qT)#{a8k~^`f}~;DwMm_#s9ifcviv6yN!MpDXVcTo(Akd9 zU6*ANWIB*wb9xD4Ir@2mAS$dDqd`vqLJ);{yTk4E=Jq4%8ftX99Mm!p3B!|polQN3 z1Mdkey1YJ`%A8zCkae2n1zxAs+_AH}eM6&8tGzWOap(I7PMtmP_T)wb9)9TVTwSw- zxzU+{mfFpQaP<-thbOORLmeWl$+TOCF_vXn5Jg@PL|Kw#8KE2uU(yuy)We6jZS07l z4gfId^}Ty{|HrQ$-PYBa{Rfp-mL0sOJ7?O80WWzR?zuu({H5W`46Vs#l91i$CCM}t zP7p<mk;$lSsIKT}Y^EtHF7C_@j*YwAo{ZNjRF+#UC1!;eFbwm|<Bv|x%q=*bnMZe$ z{OhkjO_8}QVi7_P?^Lm|G~FyaJ@8|*qZE;Cd<t-aR>fk{kib(UHW{@fNeLnfhWNp; z$-&VHhM|g#`U-35#>N(sqyPX-)iq7kH2{F|xv7)qF3|*&ZX4L+^+O1$IF*XQR##J% z4fw~OxWBW#KIcJ7hQip~<<5p(`2ru{{4S3_7sWS`(w~cx#85O%(}Dmnrl>IC@IWsD zUZ3dk&R-px7G<Hxs6DW|$D}U;05nzCH$7Va)~P=`U0hm*72vqHKlt#$-a8f8yS={Q zvCKzG?%u!a$;bESDM687XngKkQ*|1_D2*jlpIkZ1GTF|Kl4N;)A*kG`jk%<hOQ<AS zHW=tfdhdz++q3=sSH~u4icV_@Rk6v~vt`q!_E!2<<rXFB%BRC`9)I8C^`%@wCChU3 zfh@}ip$8A&@x)_ygM11_(v4MJ2CX^A;D;u!1w%QQ9c6cVC7DcV@o9k%hdNQ_pFaFx zB<s9BGkx-0KS>bjuAL)E!eTa;TP*|tf+%{tzVWGPQIb@yor?i)Ew{Y*`~%HRRRt(a zSW4gCxRU@x&Rjhw1iXHZrgJa_Hpolq4&td!ammyDeRp-=sB1UW))g5{Z=Luk?V<ys z`31+U%^tJQUAlQ(O;gRi`?qi3+FY=TR7Bk5{BUDcd(OZQj9sHCHYd~lAw;>|cL!rE zL9wl|uBU5L%v079^JDkz|NZ+P$g*6RpI)!mm6e<8>dN-+>L@NM_)eG@aKfS>hBT}$ z2jHg{CMl4!_9{tGIjm$LmU?@3R9lk{R}>o!&piC#TPHqrx)$>>T^T|Mp#-H6fC7tn z9K=C~7h4$bqNm8DEBv6d48;lCwf6edt%4LW9%FQR;GBlZ%~n1L<N1Z48Y5PY@eo2l z!29;@F`G<k3(=|BQ|J36Nz8J6Jj-g#=Hj}Vs<y_)shN>?-Z{nx0{|zOS86UXZ`szh zt$U-X*jPyRBtcb`wOdSOS%Dv#81(0E7|rVoaRN>mGL*sdLa4WAdrf&o1{W|eJlc2l zQ;y^C(sq|A!BZ4nTvSw9ZfS0)?`my{+00rHg;##|%9)Q&VF(irM*#p@S~u+6v#qJQ zu3!#;W%TX!DY85z@UkqPz1qj-Zk_s!-A$32jKPbNRAx0D*tsjq%kTw)=dTRT*&RNA zAmRgVP)C?%7_F8qD=lrRt!-~^RI`2M)ZEPf`G5Z~KQ%=VMEJjfCB=#ySj#LuySumU z=u~bK<wyvNsjjBHDMRr6BbP)mmyvON#--EhGXozILWl3%V=gMr`HvLfLLPsBp-8Pp zQ)Dz`Y?nWO;}`F~eGDwQ4RGrQE#YsW)9d!^>*?9Mh0gON6qeSt*Y6|<GHvjZES$e~ znIfp%g4gQ|>4Jw45(ND0y$8Uum!YxY@Bi?7oX@8`9l>Zc+|j#dYj+;4pCCY~skWx9 zIc@NlhWm1B?f`&^S+`EBOAEXpitQV!x3+eG6(as%;P1cp9sA5w!i?`0{3gThy*s;m zx~TkEKTGM_8g`ONj6N}V2&FRv7qc0AO%mh%EW@e?FG%7YTQ}BJRDu;H5W*k)<Oc(N z7l^q1x8h^Jxup2ugZH$w)#t<LEk*U!)}}PT4~}2)2ZS7V7cjOj3M4_O1kVe?efxS! zi;BR?lvjWC+Nl%o5pj_|;Xy-F{e6deOD#FhU|3q;(U5qG4)yJCe>=W*ADSE^i5!QY zkRVF3+PsP5Ll5=tD>fRzij^%Jw*+Nr;`%5_hWF7|60gVGfANYCl4|NIa~SwBmI;zI zXicgtescc$+`=Nr^}>9&pM#Kz&)pJG4{?tkxLc=L4U24k_Qo$x{rNbda^*0_rsAUe z9_ZcBT9>N}&@hJf`ke{-JP9K4!aT^sb_}AZYN&%3h5PsQtPbh`fTtgOa@)>51W8iK zg<N`;B*~yZ@Y`P=d-FH%iF|JQW-=6cF_;>BAmqc4!g&xGrd}H?Nz%@)meOJ~SVi)s z=U(2>-VseV<{<v$$k6D&{`i-()Ak%>nn;>+j;97cJUJ3>KjmByMyW0lHPu=-)YOC3 zB?Liy{m9qNWn~H3CsT-EAo%aE|L)}bpCFj+%{L@DgyVjEGA6C_2RWQ4Np<}cg}OU8 zfz>E9O&@*fs}##7G<Ss<(0AeT&wu*HqBE<R-J%p)^x2ibJ3KZ5=c|>76mz;@h<l{B z7pz{Xsi=DRk<SA{1@BwM<#hkz)i<t>Ol6+i1MKwKl)z8UPZI>llff&@v6N(af6q3s z+NF2*osF$+VOv)S`SAx3!nb~RJS(@4rI__r<gI?5&*S&TNkd?<k*%_pfi)m6Joy5x z(MH&-QG&?vK>y(He|?<eGGQdh{Gx9mF?ff^Mga!pO_E(xfD0VlvlpxlDKeVwyZ<mC z2=#U!E%S4>U%!6L<w$?qQ;a=<B;aT4vj7x&_h1abj*YEgEy?~pcb8UFM$nQ=qB7)j zT<DEo{&8l~mUfPX#OMV3CU}o8fb%Men{<J;h9<Da<k7>ABMf3(JsBk_L;fF+y+1rS zo@P-e2Kk%S!HpbVkT?uUOyWG7_pOCHMECCM25V2+nwl%?>KAQuVT&M^2CkxSs1xa? zM4pW~IQi$(et)ogSC`6}BM3vM*Jjj}++y)F3p07@+bEd4By;7KGO#A)kwcGSKt!83 zK@e%#JxP+6E)1ML*{6QHL?Nnod&A<LZdZYC4}cK9YsWUQR;8i3uC$`U=XAuFcrv?> zEE|fEp=%?OB;S3Yhad?RE*C;1QzU)U;{AaT&bPhas#hU_tFl&rH7s}T+aFHv<4s)s zNs6Mz$0kl3KcmL(WhimH@20DlWC6-3@8F4B$hXv2g0(H%J2z{MrueEop_7kE{$n}; z(^Io2-%q_oE<$k8zi<=0H?T+m3g=&Lnmf<;bZuGV;0c0g-q4zot4h0{nVLQIr_}5P zF?18W-DSrZ;R2?1EQ7(i0I+Y@J_LaJqE6Wv%udgL{K17(xte@4xpVt{g~;rpx(AzE zTGpup04glyhT>u=7)+MO#gtm%^YJGm`QY^A+_}>OJ$pANtML#*G8Acwr2zn;kWh$> ze(5tpJm1pLxK2GR^>t0-!-Me%6LL*<GFlbJM<?}q-KK4=$?`j1<cvC&MhHq0EX205 zODYJlw9Y#s9j%>XLs!Eax1?3nDcJqsz>rp}Y3Zm>*v1J2Jw~0G7G)knOy<8!Pb_^z zZMkKgcSM@&n+TerqDI40`g3Kw51+hr@v6a~tEx-T9}7uA001pYA&dYf@(w=SU_c1> zY}&leJ0cWGnoCPKk0+XRHg+F5`N`?N{f52f(%8AxvMd1rXs_Q3Fh=<g@&tha03kl4 z(`eUuM~lT$#`}EW){T9_LQzz@b{~E6%!hrw2Y2iAnwb6_0D$xae7GP&kput$qV)hD zm)n<BlPW}IQ5Stu;DxgvU5c5v6E<=>#Pfye(ucvb%=*m<Vx_LS_5#8TO(k^o36Iq$ z0bY-Ppl@XB&i1I7ix7geAc}<nPXHiElDWvZPC7=)ORXeLktC_?>Z6a-N&==QXG^W- zy2gs7QXW7g)1oM<AJ@xLBqY^VR<Dze&+izPC6_i&hz6hVID;f$;L^3?5@S)ZAspjn zDAA%M6>LCOhEk<vy_QSFo?(b35DM;Hjb<ct1{mZ1^Vjz6@1`gcAq0^`C!ZFT5Ad=< zt6#?)FB*+jUfMoM*}Z3+1cW$#^x9PWrbYlTM2LopQ($u}NTMiu9do?UG=mbw__SPo z$|PWFVz#WJ)KYH77|~FM1+#dP!Z}}dzdD3v8JQ$=;_8)?fGhpOdwRD6fa&l~Ert1d z3{9-fI}E0_c#4i>^=gbbW6gjv9J@B%T+>Bk1PW*I>!a{VYh4`P8Y6r6o>EKf^9v!K zr!l|<i}4r|2*IVB4y;R5@`Dh$G(Z=PO}%?hOG{{yq-mNcTyh5ph~#zf3BY3*cJ(pH z)6L{nY6eBqG)0mH15aQAVYrSt0eA?bUHy%pD{d)8u95(fBx#0a3OS=*ltc})Udku1 z2?dK+69UvH0SIG~q-cXykC3BaUvR;-VA7k{LEn=4V2mN8NLoGeY?1(mrWlH)i;P8u zw0OH~p}DSY9d@+%d_I~aqjwpP_xZ{ikd~`wSel|3+EQvp2p4RDwA<}nCmkcRb5j&W z1FU4z$rK`kB!FcZnqp{{W=V>Wr2^$#UcYahbS(J!8H%DKD;v^s@);xnEXz<NO;aST z)v-RIKzDQJf;<LT<t?(-h`4===HlXTOEX<3pMeIj8Vvw|rYXi~FnHbm!hA`A7hPV5 zwYYqpcT|k`l$y;TZb7^nC!awQpwVdo05nZAH5C=pQ*#CTo`WNUckf&We?wf0P5?5g z<uXnJjCvygfMzIdT}{=QbA1JC<IK#>uk(&b|G-6)$(XQvlM^Q&|FFnZ3;>`Rngsys zjXJ+KP?)c}=<-IE=da7v!GR4ejbY50Ir#`(H5z~cD6>?6@S;hAASx@YUUz}=ZBY=1 zu3y{Ovc9YWKnO=hhPQ0pM1UJ3G%<A5+q6pkpc%@bGu;4B(R5c^$F;$+)ceimNcyf0 ztb+#tT<H5mr`M1q4U*V*&V9Z{$A(+xGys4iX_G-;Tw+>ux(oA#=Vupqk<+qky=i~) z!xPmt)g+N%0b4>1$i~TsA8NJQuqKfJ04<}(0CcvuphAfxNoV`du5s!P=fd#FP(?*W z<OU`2H!%q>j){2~IT`&o**}SSrD^HLeIx)t%Nik+IyN-Z3|%nxm#<#KU`@}+IdSSZ zlwo;UxiV~(8le0z{1*^JO+{_^)9FYQAqb+Qqxn+b)dIDvT%OCHUfSBRea)tIr_X%M zYFNGA2=L87o-n$n3;`;`yhcM8n=CiM0|0261sLzy-aR-t%!h=+eECyn&a7GRADubj zaeF$uI!J<y_IxT~XO;wLw5*2F-E{Q;04<{n@42>p+vb9KdxzaMFx0;WsmrqT=3BqR z7&kRFD){#JyOd>_1Q-lA7cSngc)hkb5c1L#)4gd^U;h=qw?M7?;~)HaQ`=^Rd*7}~ zdF$;rTuv84sJf~qdcL`O%T5^=68L-o>Z0!VLq=W~iS&o=y9Wb+3nDIu`@Ij}TT|3M zUib0$-bDyi*Hmh?`phg_`DDVEF)Ue9R1s_O004&8AOrybH5HYcH+Nj>yHc1R;=|LQ z?B2es$hcPKWBvM#pK%<AG49&5DQs%lShjjsq19^`ijB2+0Dw_vmf?-v?+)H|m$}4T zm`ESuLcjR^FV_h5zRTx6{`lkY7jLMq&#h%Ey9#T`EhD02w8cll4M7l3JoXT)(ZGVp z(5GW3&wa4!sRx3ApT71l;Ts8;m05~R=I~FQKiCnWXtJiVF)?@m0L$FmmdIRG^tne5 z5hPInqlXY4`@=hP3$v>m{J*^V&mOlYeE0C3Jv*bpL^MDR*9?*XR>#CN$Zr8})R`f= zIr*-xy5@m{`w_wgU@!2(k6-&&8Lrx`k=}j(t-gyF!_*PRt*vblPBF=Ku3$$?S=<is zw+xEY6pH}@fQqCK+c$6KMe*HtPZVI_&OX2Jlb^qG^x31UkNV{+7k~ZRU*4dOP)q9u zz0MG>vJ$3d3QuK_@sTu9Q`Vpa9sr=%7)9xp&fVS}J6M)}^Vo3&^F9;zQs0%=^shbp z*=JW1^*P)0kACt`vLuJ8V~lt2-W8!0jXC~d_&Ce-p4Bq!Qo}AOc%!a#fuE#ECi>)# z&09%={Oucmfca;C^5p5_BGW_nKC(KfFS?!I|G(c0*Kc9b>vi>YjpWic2r<-SdN1)B zpr*qEZk=scU!CASUv&H%$V8K(wr|>8Qfz+p=f4X0^FBlC_s8Bb8BM*r?^y-Z|JQfF z<8U}4P97n&@6LTRMaMhy$eFaBO4;Kh8DJ?+a0{3O@0Vm@(PyV_UCbPQS%BkSdF^L2 zQ+ZFnNs@f@k<UDQ@Zpt9-RW|C_aFa<W5E$FTf%=KLVx?W-_+|2F+XhNIObu@apX+0 zcSRqBk1bY9Q*DPT@Bn}X_f*VgHIWZS2pv2A-p3!EMJV5HpE!Kz;1?c#awSr?+2_9h z!|ysB&PcB!41Q-%_d}m~Bpzfu)O4Rpr~w3pH+Sr$qZ)Q8!1H3jAM`{An3&I)nwx$7 z7r%BaIP=Z^&bxLWeeUSWT6r@xGWercei-lvVyGj8zVX*zFD<dEH{~pqLub-<G$y{s z8<A|Otj#qZ(UgQAgAn@TpWZ)p>Jx$I^ZGk(XleYLuY9AlxO7EO|I^90fA{;}Nuqeu zy)UtEYj1t-+2_^RYg&Fj=~Do9wrx$e8$nX=oZt&`zUcfS;WY(0?u|eG;rzLND9ic# zH4R3?(U)G@)4i;3I?eN;pZ@H}0|NumRvvx)wZHsoRb@@CoOwzOVD(IAQ_^`Zgu>!@ z`{HCI(kp-7oZWux?RTzT`80paaY&LpaIp8tQ!i80a@;~^Y<&3jpZ}ZF>5TF15%w*u z8(w_zWg=5kPTS9uxTAS<eEF^lJjeU}oSP&_m0IRpbiVn{@&3Lml9aE`tJP}x;&ad5 zx%1BDgFMIu-+KEuXV0FMWjWr;Bl1_@_<ChUReZjjl`~JS0gRSzZ``VsJt=R8vEZJJ zxld8bYYGH|fBNv$*|Qg2&c!@se4Dp)e(lItD$8#3M%c0}pZxg!4^I9$7zoCbjyC$X z_SP3(c!`Mn0TVvV-p?Z-cQkKhXieteMM+rn*~q1-QEJpJa(#ot!yleLbM4x2hzsTX zN2h6KN6*&3c>1N9%9_F>hY+6cJALBhpWKV?82e6O^ay?PTYpn-El=o{)qqSZ2|ySd zi;Rs`DfXKoQf`3b^vp&!!cBG^@zf)KAwvCEube%9ad>zv7zpM#@KaQG_tq~y`D|-b zf%etmLcveYeR%G|S+B<%Mw`sNM=buX-a9^X=;8R^IUZq7{5&G0&gLCts%ea=!6O81 zi<30Tq-E|2A6}mvztBH0G(0*tJ1<K)s{#musBfsd>&|_jJN&popRYS$jEsGH>GFl) zkzs-7BfJxmj&}Gg%lzGc`a50JX6?xgJtrD~0k&Gp%gm{RAfaZ<D?hi$g#uYpkA5gh z^6>Ssq0y1+*C%ZA3x1zJNB*Dg>}ub+y}NgBZ(Vg=E~2<JHZeRpHat2u;`jNZO<aL} z^us5<@VTCyyHj#i83Iy9dPG8n5-x4<005h7f&ip~_9gtA>|xBUG<-q-==Jf*>FI?9 zr^D%TF1Yxtn?j|Q(zf=Nu8z*O=C;n3&LUHh$~U?_PP@Z4Z=0Q)pR?O+vMk4AR;C^~ zuvkjJ`K@o!6s?|XHc0@)a&to`OKWopUV@@yaVB~bzKqQsB)V@(j9LT(oXhKSExKJE z_oCb5@%jS3fY;|21(D|kQ4rIe7-BS;s;VliWtNJvGON{6Szc~7nP`$0BmqGb3<h{U z6bJ-;KA$Yh7~>em33(^<?a>ea!`Hsj)YzN>*UXXtz0p`x)~MDys(c+ou{y0$5JJf= zP64yR_eto-FvdE)wpL$LT~QUS76{$E*Euf;A)XHjJRb^$mmo>9EC|xlawM!_SPZa+ zWf8&*P0=JxEOnX@LXP=)`|NDONnkM_6nRVZLG<}#@7=hmv#GH;X1oJL&A&)?KCM?q zMrlRJSI14W$pLr(K#8f`CQd~5;Zra1Y7wtA@wyT-!Wi?AWf+F0O$I~s&#mw`hNT*b z#~;r-=4FvHBuPH;`6nW?Ei&dB|FZa3VvJ=ZHP>%UYbYzdwM%6swb9#8XW-=3z>eRb zP5EK6|D4c#RU%KOF$o{WoBmTzf5BW_5;KoBLM!@A{G`g5SH{0F_LT%KF<VuJ_6)&O zBwcK@X1w*d8rW*gJ^o=zO^PwugcOrmd_w#R{=cQQrF;9%Tya%U9fBYLK>&&<FG;(L zmG){ygRV%c)kp4RlYzM_!&c*L6K>6{Z0M1p<mlIg)696=RmLA5=A%`CqNrz|eI|P9 zbT(WST*Xpo4>eVHWYYV};60Y2s_6S@s5f`@VLmM@SFRZ2`KeI?1^mik{>i7FFc+67 z(^Ah>`IQnBHq>;I8Lc(WaD8%lX&ppzy1`xncEV~$C4L1HPge<4diaD19YUzNwRuN( zPqOx6W*U&pRX{9TORJ+7KNSKzNsyIg4H%%5m=nTQj{Pcgx@4-BR%Vwh-pA+g$r8HA zu|~r_|J-xYt60=%KxRn*21utfl$flU4|8PvPKIJF<|>6oikf;oo188oRAtwqGMP`9 zRVb8j;fF82^kO)ZSFrMU4agt~00aOeS!HPeSx8n}QRp;=l42{u=r)#cYBD=D6<tab zSMJ;N?!UXEy;Iq%=OhFGf{>t?a?~}K4V=WSP<;u)$nAB4B;A92mvG7%hC&IKP#cn& zxN<^QQ(OI+&peb69L_Cm000G+Nkl<ZYQk1b!i-o|hle0|G1yYODF*{u+5d|og9Sn4 z_PV0?-O5u57f&l?EKixnt2gn4VV<FxBS(&~469J!#BWfeUIU`>b7HWiwks#MY0b?R z(&nNv1d!M3PS}RbVF{-^JgCNvCscxjF<wnVhcSNs#plBHn=(#in^w?($WtMSYp(6e z)kaY{+dI6psDdC!kJpv+wtP-XI0Yq8<KdI3$bp0VH+5|RiPo`ZpaIG7V*o-za6`>T zGI!g9<#L~~5>r{J*&5ldPffj^WeJzA+gDEGlMTux>)Uj0>^OYrA)x5tmECgc1RelD z5Fs(g)N^U^VJS9RNs_WVX2XMc$*Q<qm2e8<{pnV53I%<_zD-$0+4IkTF?wmKdizc* z2?&YYhMJ8zUqqJsodr$$lIn`ah}NpFurny(l9_mX6JF)OtHQgYjh@x8U;gq@omQv5 zYR}*W7$XTu8>&0=v2-vmTT1G+#)jI~urVZqov=1jS%0gn3zCh*C^L>9cZmt}fFQnf z^h>2?O9oZDdJT}FL~C^Q6|EpYlCQl)X^P!Yw^6IpMvvnqoSl)usEk5pmsa_%j6Ye@ z_w>_GZfM+)VZc_G1cXGc*kmm$sswqHJZ>UO5M+H-Yq_-|W(+sW5>DCer#mF0fIneE zcj)i~JGytK`r<_9A%Gx!oWHK3CEvGR&in4c7IRfYT{A&~>~lIb&3W~+sZx6Q__Tk| zzTNlSbFXT>C(_jbh#@cVt#w@mxJ6eXwv9Gui`tvFnoOpQOSp8K^XjX(l%q0{gH4+^ ze)h4)GpMOlCIP${(rb$vs#-xoq(J+HlLXmN(^gYm7oYLvq=ZvHp-LtGn1rsOvHqE- zpQT7DW!TQ3YR3Qv_&{xWv)O0?g_4496kl3g(b2NaXfmc%!lgU2O1YLxIdwWd98}d* zz5Mda48y8-+Uk>lkjT-rW<zx+Nfvb7f1z*pNK;I6{YH=9F*$u*5@q!h>r!TRAe{+S z>StD!SCk)l`G{7d%eXnC5YYuusH<opZ^wNahzzbcCxS7awNK33W)VawC%~kfGoMT% zYhvOT$HcFaiC-LJv09FP`KU3Sg_vr7PYiH?3zU~u8?;5>Hpy)R9~M#K$ESzfZa0D{ zX00bw0yXU8cgj}4AH58!)KYTv=$DNKV`gfd>?uwN>NUkya|O7qa+|@2B^dHg&WtWD zE{5mwq_sFEUF0d3Ki;5jE&bAwBSwQMd&hROEhB^|im9^H=VU;AHGmI`Kj@j98Fjf9 zF;Ze2uK^Iklp2uI!$(_uS$WyZFTbqU<?Ifq93LbIx~8mgIUrwl;BS<(LU3Yw)MlHP zWvIr`W7sEC0yP0XEY-EuFMRO@twx*ucfkN~e1M^}m6p2YgM68S4~q<?$(fNk+ibwk z;pF*UOyZVM3DkJ_$iupZx@VtxM#E~ezkZGn6`QQ3S<HZ5i{K;T_Bke}$80v6C`by) zyn+&_5AYi|ZG7~RM;V&Q!o)Gha|n^O<@GehEax9~xq}Z2!pOETGdn+Jx7!3>RGG~s zE8(I&K_sEuy?57r_uikGL&gAbp`a+ka&zTMxsTe)0DrUTfn?jl%<SBh-C_6p0tjYa z!bR{y2oD{8Fy)wAqKknXAHsmNn#)YOVz8oQg@KQ$0_JSfHv62@<@CCJ(at;`c{1zA z0Du08&$YF*tL(iX1VbV(L!{FfD@rO0+-F?}A6E;AoNZxtanb2=Ih~6xpT`^G1t`nP z__aFCQ%^k=v(spd28gmKh$2LYB59+c$YLs6Zu$9|1|LsOltPOhm)q^~`n_B*5ahUE zFv#;Ep64NyMNwi|=79$vG#X3@-{==Y1Tg{_0FoeRn$>HJCPNWRvtTvK{|CIjvk%3H Rk23%O002ovPDHLkV1hGG@RR@m diff --git a/py3donate.html b/py3donate.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_cHkzZG9uYXRlLmh0bWw=..0000000000000000000000000000000000000000 --- a/py3donate.html +++ /dev/null @@ -1,326 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Call for donations - PyPy to support Python3!</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Call for donations - PyPy to support Python3!</h1> -<p>UPDATE (December 2017):</p> -<blockquote> -PyPy3 supporting Python 3.5 has been released.</blockquote> -<p>UPDATE (August 2016):</p> -<blockquote> -<em>We are soon releasing a beta supporting Python 3.3. For the next -full year, though, see</em> <a class="reference external" href="https://morepypy.blogspot.ch/2016/08/pypy-gets-funding-from-mozilla-for.html">PyPy gets funding from Mozilla for Python 3.5 -support</a>. <em>Individual donations through here are still welcome, and -go towards the same goal, which is upgrading PyPy to support Python -3.x (which really means 3.3/3.5 by now). Thanks to all our past -contributors! Your money has been put to good use so far.</em></blockquote> -<p>UPDATE (February 2014):</p> -<blockquote> -<em>Thanks to our donors, we have raised 45% of -the total so far. Work on this topic has been happening, and -continues to happen, within the budget – even if not within the -timeline described below. We have simply not found enough time to -work on it as much as we wanted, and thus did not consume the money as -quickly as predicted. The ratio “progress / $ used” so far -corresponds roughly to what we expected. The document below is the -original call for proposal, and we still accept donations for this -topic.</em></blockquote> -<p>The release of Python 3 has been a major undertaking for the Python -community, both technically and socially. So far the PyPy interpreter -implements only version 2 of the Python language and is increasingly -used in production systems. It thus contributes to the general risk -of a long lasting Python community split where a lot of people -continue using Python 2 while others work with Python 3, making it -harder for everyone.</p> -<p>The PyPy project is in a unique position in that it could support -Python 3 without having to discontinue supporting Python 2, with the possibility of reusing a large part of the code base and fully -reusing its unique translation and JIT-Compiler technologies. -However, it requires a lot of work, and it will take a long time -before we can complete a Python 3 port if we only wait for volunteer -work. Thus, we are asking the community to help with funding the -necessary work, to make it happen faster. <a class="reference internal" href="#here">Here</a> is a more detailed view on how our proposed work benefits the Python community and the general public.</p> -<p>Below you'll find the <a class="reference internal" href="#planned-stages-of-work">planned stages of work</a> and the associated -fundraising targets we need to make things happen. Once we reach the -necessary target for each stage, we will start contracting -developers. Contracts and money are managed by the non-profit -<a class="reference external" href="http://sfconservancy.org/">Software Freedom Conservancy</a> of which the PyPy project is a member. -The current elected representatives are Carl Friedrich Bolz, Holger -Krekel and Jacob Hallen and they will - in close collaboration with -Conservancy and the core developers - select the best developers for -the Python 3 porting job among well known PyPy contributors.</p> -<p>If you want to see PyPy support Python 3 and Python 2, donate using buttons -on the side.</p> -<p>Should we not receive enough donations to complete all stages by 1st March 2012 -at the latest, we will try our best to make PyPy support Python 3 anyway. We -however reserve the right to shift any unused funds to other PyPy activities -when that date is reached. Of course, since the Conservancy is a -501(c)(3) charitable organization incorporated in NY, USA, all funds will, -regardless of their use, be spent in a way that benefits the general -public, the advancement of Open Source and Free Software, -and in particular the PyPy community and the PyPy codebase.</p> -<p><strong>Note</strong> For donations higher than $1,000, we can arrange for an invoice -and a different payment method to avoid the high Paypal fees. Please -contact pypy at sfconservancy.org if you want to know details on how -to donate via other means.</p> -<div class="section" id="id2"> -<span id="planned-stages-of-work"></span><h1>Planned stages of work</h1> -<p>The goal of this project is to write an interpreter that interprets -version 3 of the Python language. To be precise we would aim at having -a Python 3.2 interpreter together in the same codebase as the python 2.7 -one.</p> -<p>At the end of the project, it will be possible to decide at -translation time whether to build an interpreter which supports Python -2.7 or Python 3.2 and both versions will be nightly tested and -available from nightly builds.</p> -<p>The focus of this project is on compatibility, not performance. In -particular, it might be possible that the resulting Python 3 -interpreter will be slower than the Python 2 one. If needed, -optimizing and making it more JIT friendly will be the scope of a -separate project. Our existing JIT generation technology should apply -out of the box; this disclaimer is only about the extra performance we -could obtain by tweaking the Python 3 interpreter or writing specific -interpreter-guided optimizations in the JIT.</p> -<div class="section" id="about-estimates-and-costs"> -<h2>About estimates and costs</h2> -<p>For each step, we estimated the time that it would take to complete for an -experienced developer who is already familiar with the PyPy codebase. From -this number, the money is calculated considering an hourly rate of $60, and a -5% general donation which goes to the <a class="reference external" href="http://sfconservancy.org/">Software Freedom Conservancy</a> itself, the non-profit -association of which the PyPy project is a member and which manages all the -issues related to donations, taxes and payments.</p> -<p>The estimated time to complete the whole project is about 10.5 person-months.</p> -<p>For comparison, the python-3000 mailing list was created in March 2006; Python -3.0 was released in December 2008 and Python 3.1, the first release genuinely -suitable for production use (due to the abysmal I/O performance of 3.0) was -released in June 2009. During these 3.5 years, a lot of people contributed to -the development of Python 3, and while it is hard to turn these numbers into -precise person-years, it sounds reasonable to think that in total it took -several person-years.</p> -<p>We have the advantage of targeting something that already exists without -having to define the destination as they go along, and also the internal -architecture of PyPy makes it easier to do the porting.</p> -</div> -<div class="section" id="step-1-core-language"> -<h2>Step 1: core language</h2> -<p>In this step, we implement all the changes to the core language, -i.e. everything which is not in the extension modules. This includes, but it -is not necessarily limited to the following items, which are split into two -big areas:</p> -<ul> -<li><p class="first"><strong>Sub-step 1.1</strong>: string vs unicode and I/O:</p> -<blockquote> -<ul class="simple"> -<li>adapt the existing testing infrastructure to support running Python 3 code</li> -<li>string vs bytes: the interpreter uses unicode strings everywhere.</li> -<li>the <tt class="docutils literal">print</tt> function</li> -<li><tt class="docutils literal">open</tt> is now an alias for <tt class="docutils literal">io.open</tt>, removal of the old file type.</li> -<li>string formatting (for the part which is not already implemented in Python -2.7)</li> -<li>the _io module (for the part which is not already implemented in Python -2.7)</li> -<li>syntactic changes to make <tt class="docutils literal">io.py</tt> importable (in particular: -<tt class="docutils literal"><span class="pre">metaclass=...</span></tt> in class declarations)</li> -<li><strong>Estimate cost</strong>: $35,000</li> -</ul> -</blockquote> -</li> -<li><p class="first"><strong>Sub-step 1.2</strong>: other syntactic changes, builtin types and functions, -exceptions:</p> -<blockquote> -<ul class="simple"> -<li>views and iterators instead of lists (e.g., <tt class="docutils literal">dict.items()</tt>, <tt class="docutils literal">map</tt>, -<tt class="docutils literal">range</tt> & co.)</li> -<li>new rules for ordering comparisons</li> -<li>removal of old-style classes</li> -<li>int/long unification</li> -<li>function annotations</li> -<li>smaller syntax changes, such as keyword-only arguments, <tt class="docutils literal">nonlocal</tt>, -extended iterable unpacking, set literals, dict and set comprehension, etc.</li> -<li>changes to exceptions: <tt class="docutils literal">__traceback__</tt> attribute, chained exceptions, -<tt class="docutils literal">del e</tt> at the end of the except block, etc.</li> -<li>changes to builtins: <tt class="docutils literal">super</tt>, <tt class="docutils literal">input</tt>, <tt class="docutils literal">next()</tt>, etc.</li> -<li>improved <tt class="docutils literal">with</tt> statement</li> -<li><strong>Estimate cost</strong>: $28,000</li> -</ul> -</blockquote> -</li> -</ul> -<p>Note that the distinction between sub-steps 1.1 and 1.2 is blurry, and it might be -possible that during the development we will decide to move items between the -two sub-steps, as needed.</p> -<p>For more information, look at the various “What's new” documents:</p> -<ul class="simple"> -<li><a class="reference external" href="http://docs.python.org/py3k/whatsnew/3.0.html">http://docs.python.org/py3k/whatsnew/3.0.html</a></li> -<li><a class="reference external" href="http://docs.python.org/py3k/whatsnew/3.1.html">http://docs.python.org/py3k/whatsnew/3.1.html</a></li> -<li><a class="reference external" href="http://docs.python.org/py3k/whatsnew/3.2.html">http://docs.python.org/py3k/whatsnew/3.2.html</a></li> -</ul> -<p><strong>Total estimate cost</strong>: $63,000</p></div> -<div class="section" id="step-2-extension-modules"> -<h2>Step 2: extension modules</h2> -<p>In this step, we implement all the changes to the extension modules which are -written in C in CPython. This includes, but it is not necessarily limited to:</p> -<ul class="simple"> -<li><tt class="docutils literal">collections</tt>, <tt class="docutils literal">gzip</tt>, <tt class="docutils literal">bz2</tt>, <tt class="docutils literal">decimal</tt>, <tt class="docutils literal">itertools</tt>, <tt class="docutils literal">re</tt>, -<tt class="docutils literal">functools</tt>, <tt class="docutils literal">pickle</tt>, <tt class="docutils literal">_elementtree</tt>, <tt class="docutils literal">math</tt>, etc.</li> -</ul> -<p><strong>Estimate cost</strong>: this is hard to do at this point, we will be able to give a -more precise estimate as soon as Step 1 is completed. As a reference, it -should be possible to complete it with $37,000</p></div> -<div class="section" id="step-3-cpyext"> -<h2>Step 3: cpyext</h2> -<p>The <tt class="docutils literal">cpyext</tt> module allows to load CPython C extensions in PyPy. Since the -C API changed a lot between Python 2.7 and Python 3.2, <tt class="docutils literal">cpyext</tt> will not -work out of the box in the Python 3 PyPy interpreter. In this step, we will -adapt it to work with Python 3 as well.</p> -<p>Note that, even for Python 2, <tt class="docutils literal">cpyext</tt> is still in a beta state. In -particular, not all extension modules compile and load correctly. As a -consequence, the same will be true for Python 3 as well. As a general rule, -we expect that if a Python 2 module works with <tt class="docutils literal">cpyext</tt>, the corresponding -Python 3 version will also work when this step is completed, although the -details might vary depending on the exact C extension module.</p> -<p><strong>Estimate cost</strong>: $5,000</p></div> -</div> -<div class="section" id="benefits-of-this-work-to-the-python-community-and-the-general-public"> -<span id="here"></span><h1>Benefits of This Work to the Python Community and the General Public</h1> -<p>Python has become one of the most popular dynamic programming languages in -the world. Web developers, educators, and scientific programmers alike -all value Python because Python code is often more readable and because -Python often increases programmer productivity.</p> -<p>Traditionally, languages like Python ran more slowly than static, compiled -languages; Python developers chose to sacrifice execution speed for ease -of programming. The PyPy project created a substantially improved Python -language implementation, including a fast Just-in-time (JIT) compiler. -The increased execution speed that PyPy provides has attracted many users, -who now find their Python code runs up to four times faster under PyPy -than under the reference implementation written in C. Some programs that -are particularly JIT-friendly see even greater speedups. See our <a class="reference external" href="http://speed.pypy.org">speed</a> -website.</p> -<p>Meanwhile, the Python community is undergoing significant change, with the -introduction of a new ‘version 3’ of the Python language (Python 3). -Python 3 breaks some backwards compatibility with 2.x series, so -programmers who seek to use Python 3 must port old code. For example, -programmers who needed old libraries might want to use Python 2 only and -programmers wanting to use new language features would like to use Python -3, but would not be able to use libraries that written for Python 2.x -without substantial rewrites. This issue could lead to a dangerous -community split: programmers who needed old libraries might only use -Python 2 and programmers seeking new language features would use Python 3, -but would not be able to use libraries written for Python 2.x.</p> -<p>PyPy currently supports only Python 2.7. While PyPy supports only version -2 of the Python language, PyPy users have an incentive to avoid Python 3. -Python programmers must chose between the language features in Python 3, -and the substantial performance benefits offered by PyPy.</p> -<p>To address this issue, the PyPy team proposes to implement Python 3 on -PyPy. With such improvements to PyPy, PyPy can support the entire -Python-using community and hopefully help to prevent any community split. -PyPy support of Python 3 would also bring the excellent code execution -performance of PyPy to those who wish to migrate to Python 3.</p> -<p>Moreover, by ensuring the latest version of the Python language -specification (Py3k) works properly and fully on PyPy, the maximal benefit -of collaboration, learning, and software improvement can happen in the -entire Python language community.</p> -<p>A broad community of developers support and develop the PyPy project, -many of whom work as volunteers. The Py3k grant should help with turning -some attention towards implementing Python 3. This will not hinder other -directions in which PyPy is going like improving performance. The goal -of the PyPy community is to support both Python 2 and Python 3 for the -foreseeable future.</p> -<p>PyPy's developers make all PyPy software available to the public without -charge, under PyPy's Open Source copyright license, the permissive MIT -License. PyPy's license assures that PyPy is equally available to -everyone freely on terms that allow both non-commercial and commercial -activity. This license allows for academics, for-profit software -developers, volunteers and enthusiasts alike to collaborate together to -make a better Python implementation for everyone.</p> -<p>Finally, tracing JITs and other programming language execution technology -used in PyPy are of current and particular interest in computer science -research. PyPy helps cross-pollinate knowledge between academic computer -science and industrial use of Python, since PyPy can function well both as -a research tool and real-world Python programming language implementation. -Continued support and evolution of PyPy in any direction, such as support -for Py3k, increases the features available from PyPy and such improvements -are expected to spark even more general interest in PyPy itself and the -Python programming language generally.</p> -<dl class="docutils"> -<dt>References on Educational Uses of Python:</dt> -<dd><ul class="first last simple"> -<li><a class="reference external" href="http://wiki.python.org/moin/SchoolsUsingPython">http://wiki.python.org/moin/SchoolsUsingPython</a></li> -<li><a class="reference external" href="http://www.python.org/doc/essays/cp4e.html">http://www.python.org/doc/essays/cp4e.html</a></li> -</ul> -</dd> -<dt>References for PyPy and its benefits:</dt> -<dd><ul class="first last simple"> -<li><a class="reference external" href="http://pypy.org/">http://pypy.org/</a></li> -<li><a class="reference external" href="http://pypy.org/features.html">http://pypy.org/features.html</a></li> -<li><a class="reference external" href="http://pypy.org/compat.html">http://pypy.org/compat.html</a></li> -</ul> -</dd> -</dl> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/redirect_bugs_pypy_org.html b/redirect_bugs_pypy_org.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_cmVkaXJlY3RfYnVnc19weXB5X29yZy5odG1s..0000000000000000000000000000000000000000 --- a/redirect_bugs_pypy_org.html +++ /dev/null @@ -1,20 +0,0 @@ -<html> -<body> -<h1>PyPy Issue tracker</h1> -<p>The issue tracker for PyPy moved here: -<a href="https://bitbucket.org/pypy/pypy/issues?status=new&status=open">https://bitbucket.org/pypy/pypy/issues</a></p> -<p>You should be redirected automatically.</p> - -<script type="text/javascript"> - -go_to = "https://bitbucket.org/pypy/pypy/issues?status=new&status=open"; -re = /[/]issue([0123456789]+)/g; -if (tokens = re.exec(document.location.href)) { - num = tokens[1]; - go_to = "https://bitbucket.org/pypy/pypy/issue/" + num + "/"; -} -document.location.href = go_to; - -</script> -</body> -</html> diff --git a/sponsor.html b/sponsor.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_c3BvbnNvci5odG1s..0000000000000000000000000000000000000000 --- a/sponsor.html +++ /dev/null @@ -1,101 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Sponsor PyPy</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<script> - $(function() { - $("#progressbar").progressbar({ - value: 0 - }); - }); -</script> -<h1 class="title">Sponsor PyPy</h1> -<p>As an Open Source project, PyPy is mostly an effort of volunteers. However, -we've decided to run a <a class="reference external" href="xxxbloglink">pilot program</a> of <a class="reference external" href="http://en.wikipedia.org/wiki/Crowdfunding">crowdfunding</a> to implement NumPy.</p> -<p>Our goal is to raise 20000 Euros by the 1st of October 2011. That should allow -us to finish implementing NumPy by the end of 2011.</p> -<div id="progressbar"> - <div class="progresstext"> - 0 of 20000 (0%) - </div> -</div> -<form action="https://www.paypal.com/cgi-bin/webscr" method="post"> -Sponsor numpy implementation in PyPy by the following amount:<br/> -<input type="text" name="amount"></input> -<input type="hidden" name="item_name" value="Sponsor NumPy on PyPy"/> -<input type="hidden" name="quantity" value="1"/> -<select name="currency_code"> - <option value="USD" selected="1">USD</option> - <option value="EUR">EUR</option> - <option value="GBP">GBP</option> -</select> -<input type="hidden" name="cmd" value=" _s-xclick"/> -<input type="hidden" name="hosted_button_id" value="QVB9EDQXBUPJY"> -<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_paynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"> -<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1"> -</form> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/success.html b/success.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_c3VjY2Vzcy5odG1s..0000000000000000000000000000000000000000 --- a/success.html +++ /dev/null @@ -1,88 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Success stories</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Success stories</h1> -<p>PyPy has been successfully used in production by various people. Here are -few excepts of feedback we received:</p> -<div class="section" id="lwn-short-experiment"> -<h1>LWN short experiment</h1> -<p>LWN has a tool they use for parsing “git log”'s output in order to do analysis -on the contributors to the Linux kernel. Simply <a class="reference external" href="http://lwn.net/Articles/442268/">by switching to PyPy</a> they -were able to get a 3x speedup, from 63 seconds to 21 seconds, compared to -CPython.</p> -<p>“In other ways, PyPy is ready for prime time; it implements the (Python 2.x) language faithfully, and it is fast.”</p> -</div> -<div class="section" id="myhdl"> -<h1>MyHDL</h1> -<p>MyHDL got a speed up by <a class="reference external" href="http://www.myhdl.org/doku.php/performance">6-12x compared to CPython</a>, on a range of benchmarks, -putting it in the same league as other HDL implementations.</p> -<p>“By simply changing the Python interpreter, MyHDL is playing in the same league as Verilog and VHDL simulators. This is a remarkable achievement, given that Python's power stays completely available. There is no reason anymore to avoid MyHDL because of performance concerns.”</p> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/tmdonate.html b/tmdonate.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_dG1kb25hdGUuaHRtbA==..0000000000000000000000000000000000000000 --- a/tmdonate.html +++ /dev/null @@ -1,380 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - Call for donations - Transactional Memory / Automatic Mutual Exclusion in PyPy</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">Call for donations - Transactional Memory / Automatic Mutual Exclusion in PyPy</h1> -<p class="download-menu"><strong>UPDATE (April 2014): this is the old Call for Donations about -Transactional Memory</strong>, kept around for historical purposes. A <a class="reference external" href="tmdonate2.html">new Call -for Donations</a> is available.</p> -<div class="section" id="introduction"> -<h1>Introduction</h1> -<p>In the presence of today's machines with multiple processors, Python -progress is lagging behind: on any CPU-constrained program, developers -have a difficult choice to make. They can use in-process solutions that -do not offer multi-CPU usage. In this respect, the natural choice -nowadays is to use Twisted or other event-based paradigms, or systems -that hide events in the control flow, like Stackless; or alternatively, -they can use the existing <tt class="docutils literal">threading</tt> module, with its associated GIL -and the complexities of real multi-threaded programming (locks, -deadlocks, races, etc.), which make this solution less attractive. The -big alternative is for them to rely on one of various multi-process -solutions that are outside the scope of the core language; all of them -in some way or another are hacks that require extra knowledge and time -to use and that have an impact on the structure of the whole program.</p> -<p>This proposal is about researching and implementing Transactional Memory -in PyPy. This is a technique that recently came to the front of the -multi-core scene. It promises to offer multi-core CPU usage without -requiring to fall back to the multi-process solutions described above, -and also without using the <tt class="docutils literal">threading</tt> module – just as a small, -local extension of the programming language that would be used only in -the core of the event loops.</p> -<p>(Jump directly to <a class="reference internal" href="#what-python-interface-will-i-use">What Python interface will I use?</a> for practical -details.)</p> -</div> -<div class="section" id="in-more-details"> -<h1>In more details</h1> -<p>This is a call for financial help in researching and implementing a -version of PyPy able to use multiple processors in a single process. -This will give a GIL-less Python, i.e. a Python that runs without the -infamous Global Interpreter Lock.</p> -<p>The basic ideas to do it have been discussed on pypy-dev <a class="reference external" href="http://mail.python.org/pipermail/pypy-dev/2011-August/008153.html">[1]</a> <a class="reference external" href="http://mail.python.org/pipermail/pypy-dev/2012-January/009034.html">[2]</a> -and on a blog post <a class="reference external" href="http://morepypy.blogspot.com/2012/01/transactional-memory-ii.html">[3]</a>. -The goal is to adapt Transactional Memory – currently only available -as software, but <a class="reference internal" href="#soon-available-as-hardware">soon available as hardware</a> – to the task of running -sections of Python code in parallel on multiple processors, while giving -the programmer the illusion of serial execution. It is called below -“PyPy-TM”.</p> -<p>The main developer will be Armin Rigo. -This is a “researchy” goal in the sense of us not being quite sure of -the performance of the result. We currently estimate the one-year -performance goal at 2x-to-5x slower than regular PyPy in fully serial -applications. We feel confident that it can work, though, in the -following sense: the performance of PyPy-TM running suited applications -should scale linearly or close-to-linearly with the number of processors. -This means that you just need a machine with at least 4 or 8 processors, -which is already common today and will be even more so in one or two -years.</p> -<p>You will find below a sketch of the <a class="reference internal" href="#work-plan">work plan</a>. If more money than -requested is collected, then the excess will be entered into the general -PyPy pot, used for example to finance sprint travel costs to students.</p> -<p><strong>Note</strong> For donations higher than $1,000, we can arrange for an invoice -and a different payment method to avoid the high Paypal fees. Please -contact pypy at sfconservancy.org if you want to know details on how -to donate via other means.</p> -<div class="section" id="what-is-the-global-interpreter-lock"> -<h2>What is the Global Interpreter Lock?</h2> -<p>The GIL, or Global Interpreter Lock, is a single lock in both CPython -and (so far) PyPy, that all threads must acquire in order to execute -Python bytecodes. This means that so far, in Python, even when using -threads we do not gain any benefit in term of multicore performance.</p> -</div> -<div class="section" id="what-is-transactional-memory"> -<h2>What is Transactional Memory?</h2> -<p><a class="reference external" href="http://en.wikipedia.org/wiki/Transactional_memory">Transactional Memory</a> – TM – is a technique imported from databases: every -time we want to do a change to the processors' main memory, we do it in -a “transaction”. Multiple transactions can be executed in parallel by -multiple cores. When a transaction is complete, we try to commit it. -This might either succeed, or (if another transaction committed -incompatible changes) fail. If it fails, which is hopefully rare, we -need to restart the transaction from scratch.</p> -</div> -<div class="section" id="why-hasn-t-the-idea-been-implemented-for-cpython-already"> -<h2>Why hasn't the idea been implemented for CPython already?</h2> -<p>Because of the additional complexity required, and mostly, because of -performance issues. There have been some experiments already with -CPython on <em>Hardware</em> Transactional Memory:</p> -<ul class="simple"> -<li><a class="reference external" href="http://sabi.net/nriley/pubs/dls6-riley.pdf">Riley and Zilles (2006)</a></li> -<li><a class="reference external" href="http://www.cs.auckland.ac.nz/~fuad/parpycan.pdf">Tabba (2010)</a></li> -</ul> -<p>The motivation for using PyPy instead of CPython is the extra -flexibility of the general approach, as well as the ability to utilize -the JIT in order to remove part of the overhead that comes with -<em>Software</em> Transactional Memory.</p> -</div> -<div class="section" id="a-gil-less-python-is-impossible"> -<h2>A GIL-less Python is impossible.</h2> -<p>This is a classic criticism of research-oriented projects. We believe -that the <a class="reference internal" href="#work-plan">work plan</a> below can make a serious impact on considering -possible a GIL-less Python. We believe we can do it, but at the -very least, even if this work generates a negative result, the negative -result will document the challenges faced should someone else want to -reattempt the idea in the future.</p> -<p>Nevertheless other projects, such as Psyco (also by Armin) and PyPy -itself, were called impossible before they were attempted, and have -hitherto been very successful.</p> -</div> -<div class="section" id="why-do-it-with-pypy-instead-of-cpython"> -<h2>Why do it with PyPy instead of CPython?</h2> -<p>Because PyPy is designed to be open to this kind of research. This will -require no work in the Python interpreter part of PyPy, and instead we -can focus on e.g. the concurrent garbage collection and the JIT issues. -<a class="reference external" href="http://sabi.net/nriley/pubs/dls6-riley.pdf">Riley and Zilles</a> have also experimented with Hardware Transactional -Memory using PyPy. By contrast, for example, CPython is stuck with -reference counting, which is known to be an issue for Transactional -Memory (<a class="reference external" href="http://www.cs.auckland.ac.nz/~fuad/parpycan.pdf">Tabba</a> proposes to give up and use <a class="reference external" href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm</a>, which is a bad -idea in our experience, particularly because of scalability issues).</p> -</div> -<div class="section" id="what-python-interface-will-i-use"> -<h2>What Python interface will I use?</h2> -<p>Previous attempts on Hardware -Transactional Memory focused on parallelizing existing programs written -using the <tt class="docutils literal">thread</tt> or <tt class="docutils literal">threading</tt> modules. However, as argued -<a class="reference external" href="http://mail.python.org/pipermail/pypy-dev/2012-January/009044.html">here</a>, this may not be the most practical way to achieve real -multithreading; it seems that better alternatives would offer good -scalability too. Notably, TM could benefit any event-based system that -is written to dispatch events serially (Twisted-based, most GUI toolkit, -Stackless, gevent, and so on). The events would internally be processed -in parallel, while maintaining the illusion of serial execution, with -all the corresponding benefits of safety. This should be possible with minimal -changes to the event dispatchers. This approach has been described by the -<a class="reference external" href="http://research.microsoft.com/en-us/projects/ame/default.aspx">Automatic Mutual Exclusion</a> work at Microsoft Research, but not been -implemented anywhere (to the best of our knowledge).</p> -<p>Note that, yes, this gives you both sides of the coin: you keep using -your non-thread-based program (without worrying about locks and their -drawbacks like deadlocks, races, and friends), <em>and</em> your programs -benefit from all your cores.</p> -<p>In more details, a low-level built-in module will provide the basics to -start transactions in parallel; but this module will be only used -internally in a tweaked version of, say, a Twisted reactor. Using this -reactor will be enough for your existing Twisted-based programs to -actually run on multiple cores. You – as a developer of the -Twisted-based program – have only to care about improving the -parallelizability of your program (e.g. by splitting time-consuming -transactions into several parts; the exact rules will be published in -detail once they are known). But the point is that your program is -always correct.</p> -<p>See some <a class="reference external" href="https://bitbucket.org/pypy/pypy/raw/stm-gc/lib_pypy/transaction.py">concrete example</a> of the API.</p> -</div> -<div class="section" id="speed"> -<h2>Speed</h2> -<p>We estimate the one-year performance target to be 2x-to-5x slower than -the performance of the regular PyPy in fully serial applications. (Of -course, the regular PyPy will not disappear; for the foreseeable future, -PyPy-TM will be an alternative executable.)</p> -<p>The performance of PyPy-TM running suited applications should scale -linearly or close-to-linearly with the number of processor. This means -that in order to see the benefits, you just need a machine with at least -4 or 8 processors – which is already common today and will be even -more so in one or two years.</p> -</div> -<div class="section" id="hardware-transactional-memory"> -<span id="soon-available-as-hardware"></span><h2>Hardware Transactional Memory</h2> -<p>The performance of PyPy-TM running on Hardware Transactional Memory is -unknown so far, but should ideally be close to the performance of a -regular PyPy.</p> -<p>In more details: This proposal is for work based entirely on <em>Software</em> -Transactional Memory. However, in the future the ideas and most of the -code should map directly to Hardware Transactional Memory (HTM). We -expect HTM to reduce a lot the cost of some of the issues that we face, -but not completely remove it. For example, <a class="reference external" href="http://developer.amd.com/tools/ASF/Pages/default.aspx">AMD's old proposal</a> was -that there would be two ways to emit memory-referencing -instructions: one that goes via the HTM mechanisms, and one (the regular -one) which doesn't. Choosing the best one on a -case-by-case basis in the JIT makes a difference in -performance (although of course not as great as with Software -Transactional Memory).</p> -<p><a class="reference external" href="http://software.intel.com/en-us/avx/">Intel's current proposal</a> on <a class="reference external" href="http://en.wikipedia.org/wiki/Haswell_%28microarchitecture%29">Haswell</a> processors does not have this -distinction, which means transactions are likely to quickly overflow the -internal buffers. As a result, the first generation HTM-capable -processors may not be suited for the approach described here. But -this depends on details like the capacity of the hardware buffers that -are still secret at this point.</p> -<p>(Note also that HTM does not solve some of the issues for implementing -Transactional Memory in CPython, notably the issue with reference -counting. We will have to wait for a real CPython experiment before -we can settle this question. Also, this would “just” remove the GIL -but not offer a multi-core version of non-thread-based programs.)</p> -</div> -<div class="section" id="alternatives"> -<h2>Alternatives</h2> -<p>PyPy-TM will be slower than judicious usage of existing alternatives, -based on multiple processes that communicate with each other in one way -or another. The counter-argument is that TM is not only a cleaner -solution: there are cases in which it is not doable to organize (or -retrofit) an existing program into the particular format needed for the -alternatives. In particular, small quickly-written programs don't need -the additional baggage of cross-process communication, and large -programs can sometimes be almost impossible to turn into multi-process -versions. By contrast, we believe that TM can fit naturally into most -programs, because it only requires local changes to some dispatcher; the -rest of the program should work without changes.</p> -</div> -<div class="section" id="more-readings"> -<h2>More readings</h2> -<ul class="simple"> -<li><a class="reference external" href="http://morepypy.blogspot.com/2011/08/we-need-software-transactional-memory.html">Original blog post</a></li> -<li>pypy-dev mails <a class="reference external" href="http://mail.python.org/pipermail/pypy-dev/2011-August/008153.html">[1]</a> <a class="reference external" href="http://mail.python.org/pipermail/pypy-dev/2012-January/009034.html">[2]</a></li> -<li><a class="reference external" href="http://morepypy.blogspot.com/search/label/stm">All our blog posts about stm</a></li> -</ul> -</div> -</div> -<div class="section" id="work-plan"> -<h1>Work plan</h1> -<p>This is an very rough estimate of the amount of work it would take to -complete the steps for an experienced developer who is already familiar -with the PyPy codebase. As this is a research proposal, we cannot -guarantee the time estimates here, but we do agree to report regularly to -the community, so our progress can be followed publicly.</p> -<p>Paid work will be at $60/hour, but at least one developer who will work on -the project – Armin Rigo – has committed to 2 hours -of volunteer work per paid hour (so -the total amount of money that we ask is divided by three). A 5% general -donation will go to the <a class="reference external" href="http://sfconservancy.org/">Software Freedom Conservancy</a> itself, the -non-profit organization of which the PyPy project is a member and which -manages all the issues related to donations, payments, and tax-exempt -status.</p> -<ul> -<li><p class="first"><strong>STM Library</strong>:</p> -<p>This part covers adapting an existing STM library for PyPy. It is -already mostly done (based on <a class="reference external" href="http://www.cs.rochester.edu/research/synchronization/rstm/">rstm</a>), but additional tweaks may be -required.</p> -</li> -<li><p class="first"><strong>Basic tweaks of the translation process</strong>:</p> -<p>This part covers tweaks needed during the translation process in -order to generate an STM-aware version of the RPython programs, -including PyPy itself. It is partly done, but not finished. -Estimate: 1 month.</p> -</li> -<li><p class="first"><strong>Garbage collection</strong>:</p> -<p>We need a different garbage collector that is able to cope at least -with concurrent allocations. From there, improving the situation is -its own open-ended subproject: we can add for example various kinds of -parallel collection, synchronized or unsynchronized root tracing, -etc. Estimate for the basic part: 2 months. Estimate for the rest: -4 extra months.</p> -</li> -<li><p class="first"><strong>User interface</strong>:</p> -<p>This is the problem of designing and implementing some interface or -interfaces for the Python programmer. We put it in its own category -because of its “end-user” importance. Estimate: 2 months.</p> -</li> -<li><p class="first"><strong>JIT integration</strong>:</p> -<p>The above would give us a (probably very slow) version of PyPy-TM. -This final part is to integrate it with the JIT compiler generator. -The main issue we foresee is integration with the new GC, detecting -with object flags or JIT optimizations which objects need -transactional memory status or not. We think that with enough such -optimizations we can seriously lower the overhead of PyPy-TM, maybe -down to 2x slower than a regular PyPy or better. Estimate: unknown; -at least 4 months.</p> -</li> -<li><p class="first"><strong>Longer term</strong>:</p> -<p>In the longer term, we might need to refine the TM processing done -above, for example to better support I/O (e.g. we can queue the writes -done to a log file) or to add some special fine-grained support -(e.g. two transactions that each do <tt class="docutils literal">samelist.append()</tt> do not need -to conflict in the simple case). This part is not included -in the estimates.</p> -<p>Note: by default, any I/O can be done, but turns the transaction -“inevitable”. An inevitable transaction must not abort, so it must be -the next one to commit. This introduces delays at the end of the other -CPUs' transactions.</p> -</li> -</ul> -<p>Total: 5 months for the initial version; at least 8 additional months -for the fast version. We will go with a total estimate of 15 months, -corresponding to USD$151200. The amount sought by this fundraising -campaign, considering the 2 volunteer hours per paid hour is thus USD$50400.</p> -</div> -<div class="section" id="benefits-of-this-work-to-the-python-community-and-the-general-public"> -<h1>Benefits of This Work to the Python Community and the General Public</h1> -<p>Python has become one of the most popular dynamic programming languages in -the world. Web developers, educators, and scientific programmers alike -all value Python because Python code is often more readable and because -Python often increases programmer productivity.</p> -<p>Traditionally, languages like Python ran more slowly than static, compiled -languages; Python developers chose to sacrifice execution speed for ease -of programming. The PyPy project created a substantially improved Python -language implementation, including a fast Just-in-time (JIT) compiler. -The increased execution speed that PyPy provides has attracted many users, -who now find their Python code runs up to four times faster under PyPy -than under the reference implementation written in C.</p> -<p>However, in the presence of today's machines with multiple processors, -Python progress lags behind. The issue has been described in the -introduction: developers that really need to use multiple CPUs are -constrained to select and use one of the multi-process solutions that -are all in some way or another hacks requiring extra knowledge and -efforts to use. The focus of the work described in this proposal is to -offer an alternative in the core of the Python language – an -alternative that can naturally integrate with the rest of the program. -This alternative will be implemented in PyPy.</p> -<p>PyPy's developers make all PyPy software available to the public without -charge, under PyPy's Open Source copyright license, the permissive MIT -License. PyPy's license assures that PyPy is equally available to -everyone freely on terms that allow both non-commercial and commercial -activity. This license allows for academics, for-profit software -developers, volunteers and enthusiasts alike to collaborate together to -make a better Python implementation for everyone.</p> -<p>PyPy-TM will be available under the same license. Being licensed freely -to the general public means that opportunities to use, improve and learn -about how Transactional Memory works itself will be generally available -to everyone.</p> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file diff --git a/tmdonate2.html b/tmdonate2.html deleted file mode 100644 index de90045ba162d007c5fe5412df14ca9a94a31cb2_dG1kb25hdGUyLmh0bWw=..0000000000000000000000000000000000000000 --- a/tmdonate2.html +++ /dev/null @@ -1,456 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>PyPy - 2nd Call for donations - Transactional Memory in PyPy</title> - <meta http-equiv="content-language" content="en" /> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta name="author" content="PyPy Team" /> - <meta name="description" content="PyPy" /> - <meta name="copyright" content="MIT" /> - <meta name="document-rating" content="general" /> - <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> - <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> - <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.14.custom.css" /> - <script type="text/javascript" src="https://use.typekit.com/hdt8sni.js"></script> - <script type="text/javascript">try{Typekit.load();}catch(e){}</script> - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> - <script type="text/javascript" src="js/jquery-ui-1.8.14.custom.min.js"></script> - <script type="text/javascript" src="js/script2.js?bust=1"></script> -</head> -<body> -<script type="text/javascript"> - var _gaq = [['_setAccount', 'UA-7778406-3'], ['_trackPageview']]; - if (document.location.protocol !== 'file:') { - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); - })(); - } -</script> -<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> -<div id="header"> - <div id="menu-follow"> - <div><a href="https://bitbucket.org/pypy/pypy"><img src="https://www.selenic.com/hg-logo/logo-droplets-25.png" width="14px" height="14px" /></a></div> - <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="https://feedburner.google.com/fb/lib/images/icons/feed-icon-12x12-orange.gif" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> - </div> - <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" height="110px" /></a></div> - <hr class="clear-left" /> - <div id="menu-sub"> - <a href="index.html">Home</a> - <span class="menu-sub-sep"> | </span> - <a href="features.html">What is PyPy?</a> - <span class="menu-sub-sep"> | </span> - <a href="download.html">Download</a> - <span class="menu-sub-sep"> | </span> - <a href="compat.html">Compatibility</a> - <span class="menu-sub-sep"> | </span> - <a href="performance.html">Performance</a> - <span class="menu-sub-sep"> | </span> - <a href="http://doc.pypy.org">Dev Documentation</a> - <span class="menu-sub-sep"> | </span> - <a href="http://morepypy.blogspot.com">Blog</a> - <span class="menu-sub-sep"> | </span> - <a href="people.html">People</a> - <span class="menu-sub-sep"> | </span> - <a href="contact.html">Contact</a> - <br /> - </div> - <hr class="clear" /> -</div> -<div id="content"> -<div> -<div id="main"> -<h1 class="title">2nd Call for donations - Transactional Memory in PyPy</h1> -<p>UPDATE (September 2016):</p> -<blockquote> -<p><strong>This call for donation is closed. Thank you everybody for -contributing!</strong></p> -<p><em>We have actually more money in the pot that we can use in the near -future. As it turns out, STM is a hard researchy topic. Remi Meier -is still actively working on this topic as part of his Ph.D. thesis. -Armin Rigo thinks more fundamental work is needed, which will -eventually lead us to a next generation attempt.</em></p> -</blockquote> -<hr class="docutils" /> -<br><br><ul class="download-menu simple"> -<li><a class="reference internal" href="#preamble">Preamble</a></li> -<li><a class="reference internal" href="#introduction">Introduction</a></li> -<li><a class="reference internal" href="#in-more-detail">In more detail</a><ul> -<li><a class="reference internal" href="#what-is-the-global-interpreter-lock">What is the Global Interpreter Lock?</a></li> -<li><a class="reference internal" href="#what-is-transactional-memory">What is Transactional Memory?</a></li> -<li><a class="reference internal" href="#hardware-vs-software-transactional-memory">Hardware vs Software Transactional Memory</a></li> -<li><a class="reference internal" href="#why-do-tm-with-pypy-instead-of-cpython">Why do TM with PyPy instead of CPython?</a></li> -<li><a class="reference internal" href="#alternatives">Alternatives</a></li> -<li><a class="reference internal" href="#platforms-other-than-the-x86-64-linux">Platforms other than the x86-64 Linux</a></li> -<li><a class="reference internal" href="#more-readings">More readings</a></li> -</ul> -</li> -<li><a class="reference internal" href="#work-plan-and-funding-details">Work plan and funding details</a><ul> -<li><a class="reference internal" href="#goal-1">Goal 1</a></li> -<li><a class="reference internal" href="#goal-2">Goal 2</a></li> -<li><a class="reference internal" href="#goal-3">Goal 3</a></li> -<li><a class="reference internal" href="#funding">Funding</a></li> -</ul> -</li> -<li><a class="reference internal" href="#benefits-of-this-work-to-the-python-community-and-the-general-public">Benefits of This Work to the Python Community and the General Public</a></li> -</ul> -<div class="section" id="preamble"> -<h1>Preamble</h1> -<p>This is the second call for donations on the topic of Transactional -Memory (<em>TM</em>) in PyPy, a way to run CPU-hungry Python programs in -multithreaded mode. It is a follow-up on our <a class="reference external" href="http://pypy.org/tmdonate.html">first call for -donations</a> from two years ago. At that time, we suggested a -single-threaded slow-down of somewhere between 2x and 5x. The aim that -seems now within reach is rather closer to 1.25x, i.e. running only 25% -slower than the regular PyPy.</p> -<p>We achieved – or overachieved – most goals laid out in the first call by -a large margin, while at the same time raising only about half the -money. The result of this first step is <a class="reference external" href="https://pypy.readthedocs.org/en/latest/stm.html">described in the documentation -of PyPy</a>. It is a PyPy without the GIL. In the best (artificial) -examples, it runs only 30% slower than a regular PyPy with the JIT.</p> -<p>The present proposal is about development of the second half: first, -fixing the various missing low-level optimizations (aiming for this -25%-30% figure, but for most cases rather than only special examples). -Then it will most -importantly focus on developing the Python-facing interface. This -includes both internal things (e.g. do dictionaries need to be more -TM-friendly in general?) as well as directly visible things (e.g. some -profiler-like interface to explore common conflicts in a program). -Finally, the third part is -exploring and tweaking some existing libraries to improve -their TM-friendliness (e.g. Twisted and Stackless).</p> -<p>See also the <a class="reference internal" href="#update-on-htm">update on HTM</a> below.</p> -</div> -<div class="section" id="introduction"> -<h1>Introduction</h1> -<p>In the presence of today's machines with multiple processors, Python -progress is lagging behind: on any CPU-constrained program, developers -have a difficult choice to make. They can use in-process solutions that -do not offer multi-CPU usage. In this respect, the natural choice -nowadays is to use Twisted or other event-based paradigms, or systems -that hide events in the control flow, like Stackless; or alternatively, -they can use the existing <tt class="docutils literal">threading</tt> module, with its associated GIL -and the complexities of real multi-threaded programming (locks, -deadlocks, races, etc.), which make this solution less attractive. The -most attractive alternative for most developers is to rely on one of various multi-process -solutions that are outside the scope of the core Python language. All of them require a -major restructuring of the program and often need extreme care and extra -knowledge to use them.</p> -<p>We propose an implemention of -Transactional Memory in PyPy. This is a technique that recently came to -the forefront of the multi-core scene. It promises to offer multi-core CPU -usage in a single process. -In particular, by modifying the core of the event systems -mentioned above, we will enable the use of multiple cores, without the -user needing to use explicitly the <tt class="docutils literal">threading</tt> module.</p> -<p>The first proposal was launched near the start of 2012 and has covered -much of the fundamental research, up to the point of getting a first -version of PyPy working in a very roughly reasonable state (after -collecting about USD$27'000, which is little more than half of the money -that was sought; hence the present second call for donations).</p> -<p>We now propose fixing the remaining issues to obtaining a -really good GIL-free PyPy (described in <a class="reference internal" href="#goal-1">goal 1</a> below). We -will then focus on the various new features needed to actually use multiple -cores without explicitly using multithreading (<a class="reference internal" href="#goal-2">goal 2</a> below), up to -and including adapting some existing framework libraries, for -example Twisted, Tornado, Stackless, or gevent (<a class="reference internal" href="#goal-3">goal 3</a> below).</p> -</div> -<div class="section" id="in-more-detail"> -<h1>In more detail</h1> -<p>This is a call for financial help in implementing a version of PyPy able -to use multiple processors in a single process, called PyPy-TM; and -developing the APIs and libraries needed as well as enhancing commonly -available frameworks to use the new feature. The developers will be -Armin Rigo and Remi Meier and possibly others.</p> -<p>We currently estimate the final performance goal to be a slow-down of -25% to 40% from the current non-TM PyPy; i.e. running a fully serial application would take between -1.25 and 1.40x the time it takes in a regular PyPy. This goal has -been reached already in some cases, but we need to make this result more -broadly applicable. We feel confident that we can reach this goal more -generally: the performance of PyPy-TM running any suitable -application should scale linearly or close-to-linearly with the number -of processors. This means that starting with two cores, such -applications should perform better than a non-TM PyPy. (All numbers -presented here are comparing different versions of PyPy which all have -the JIT enabled. A “suitable application” is one without many conflicts; -see <a class="reference internal" href="#goal-2">goal 2</a>.)</p> -<p>You will find below a sketch of the <a class="reference internal" href="#work-plan">work plan</a>. We start with a Q&A.</p> -<div class="section" id="what-is-the-global-interpreter-lock"> -<h2>What is the Global Interpreter Lock?</h2> -<p>The GIL, or Global Interpreter Lock, is a single lock in both CPython -and the regular PyPy. Every thread must acquire it in order to execute -Python bytecodes. This means that both with CPython and with the -regular PyPy, Python programs do not gain any benefit in term of -multicore performance even if they are using threads.</p> -</div> -<div class="section" id="what-is-transactional-memory"> -<h2>What is Transactional Memory?</h2> -<p><a class="reference external" href="http://en.wikipedia.org/wiki/Transactional_memory">Transactional Memory</a> (<em>TM</em>) is a technique imported from -databases: every time we want to do a change to the processors' main -memory, we do it in a “transaction”. Multiple transactions can be -executed in parallel by multiple cores. When a transaction is complete, -we try to commit it. This might either succeed, or (if another -transaction committed incompatible changes) fail. If it fails, which is -hopefully rare, we need to restart the transaction from scratch.</p> -<p>Transactional Memory research has progressed a lot since two years ago, -notably with the introduction of Intel's <a class="reference external" href="http://en.wikipedia.org/wiki/Haswell_%28microarchitecture%29">Haswell</a> processors, which -offer Hardware Transactional Memory (HTM). We discuss below why we -think HTM is, so far, still not suitable for our goals.</p> -</div> -<div class="section" id="hardware-vs-software-transactional-memory"> -<span id="update-on-htm"></span><h2>Hardware vs Software Transactional Memory</h2> -<p>The idea of Transactional Memory was recently made popular by Intel's -<a class="reference external" href="http://en.wikipedia.org/wiki/Haswell_%28microarchitecture%29">Haswell</a> processor (released in 2013). We could replace most of the -Software Transactional Memory (STM) library currently used inside PyPy -with a much smaller Hardware Transactional Memory (HTM) library based on -hardware features and running on Haswell-generation processors. This -has been attempted by Remi Meier recently. However, it seems that it -fails to scale as we would expect it to: the current generation of HTM -processors is limited to run small-scale transactions. Even the default -transaction size used in PyPy-STM is often too much for HTM; and -reducing this size increases overhead without completely solving the -problem. Based on this experience, it seems safe to say that right now -HTM-enabled processors lack the support that we need.</p> -<p>Future processors might improve on various aspects. We are particularly -interested in <a class="reference external" href="http://pages.cs.wisc.edu/~isca2005/papers/08A-02.PDF">Virtualizing Transactional Memory</a>, a 2005 paper that -describes the limits that we're running into and how to solve them more -generally. A CPU with support for the virtual memory described in this -paper would certainly be better for running PyPy-HTM.</p> -<p>Another issue in HTM is sub-cache-line false conflicts (conflicts caused by two -independent objects that happens to live in the same cache line, which -is usually 64 bytes). This is in contrast with the current PyPy-STM, -which doesn't have false conflicts of this kind at all and might thus be -ultimately better for very-long-running transactions. We are not aware of -published research discussing issues of sub-cache-line false conflicts.</p> -<p>Note that right now PyPy-STM has false conflicts within the same object, -e.g. within a list or a dictionary; but we can easily do something -about it (see <cite>goal 2_</cite>). Also, it might be possible in PyPy-HTM to -arrange objects in memory ahead of time so that such conflicts are very -rare; but we will never get a rate of exactly 0%, which might be -required for very-long-running transactions.</p> -</div> -<div class="section" id="why-do-tm-with-pypy-instead-of-cpython"> -<h2>Why do TM with PyPy instead of CPython?</h2> -<p>While there have been early experiments on Hardware Transactional Memory -with CPython (<a class="reference external" href="http://sabi.net/nriley/pubs/dls6-riley.pdf">Riley and Zilles (2006)</a>, <a class="reference external" href="http://www.cs.auckland.ac.nz/~fuad/parpycan.pdf">Tabba (2010)</a>), there has -been none in the past few years. To the best of our knowledge, -the closest is an attempt using <a class="reference external" href="http://researcher.watson.ibm.com/researcher/files/jp-ODAIRA/PPoPP2014_RubyGILHTM.pdf">Haswell on the -Ruby interpreter</a>. None of these attempts tries to do the same using -Software Transactional Memory. We would nowadays consider it possible -to adapt our stmgc-c7 library for CPython, but it would be a lot of -work, starting from changing the reference-counting garbage collection scheme. PyPy is -better designed to be open to this kind of research.</p> -<p>However, the best argument from an objective point of view is probably -that PyPy has already implemented a Just-in-Time compiler. It is thus -starting from a better position in terms of performance, particularly -for the long-running kind of programs that we target here.</p> -</div> -<div class="section" id="alternatives"> -<h2>Alternatives</h2> -<p>PyPy-TM will be slower than judicious usage of existing alternatives, -based on multiple processes that communicate with each other in one way -or another. The counter-argument is that TM is not only a cleaner -solution: there are cases in which it is not really possible to organize (or -retrofit) an existing program into the particular format needed for the -alternatives. In particular, small quickly-written programs don't need -the additional baggage of cross-process communication; and large -programs can sometimes be almost impossible to turn into multi-process -versions. By contrast, we believe that TM can fit naturally into most -programs, because it only requires local changes to some dispatcher; the -rest of the program should work without changes.</p> -</div> -<div class="section" id="platforms-other-than-the-x86-64-linux"> -<h2>Platforms other than the x86-64 Linux</h2> -<p>The current solution depends on having a -huge address space available. Porting to any 32-bit -architecture would quickly run into the limitation of a 2GB or 4GB of address space. -The way TM works right now would further divide this -limit by N+1, where N is the number of segments. It might be possible -to create partially different memory views for multiple threads that -each access the same range of addresses; but this would likely require -changes inside the OS. We didn't investigate so far.</p> -<p>The current 64-bit version relies -heavily on Linux- and clang-only features. We believe it is a suitable -restriction: a lot of multi- and many-core servers commonly available -are nowadays x86-64 machines running Linux. Nevertheless, non-Linux -solutions appear to be possible as well. OS X (and likely the various -BSDs) seems to handle <tt class="docutils literal">mmap()</tt> better than Linux does, and can remap -individual pages of an existing mapping to various pages without hitting -a limit of 65536 like Linux. Windows might also have a solution, although we -didn't measure yet; but first we would need a 64-bit Windows PyPy, which has -not seen much active support.</p> -<p>We will likely explore the OS X path (as well as the Windows path if Win64 -support grows in PyPy), but this is not part of this current -donation proposal.</p> -<p>It might be possible to adapt the work done on x86-64 to the 64-bit -ARMv8 as well. We have not investigated this so far.</p> -</div> -<div class="section" id="more-readings"> -<h2>More readings</h2> -<p>See the <a class="reference external" href="http://pypy.readthedocs.org/en/latest/stm.html">STM page of our documentation</a> and <a class="reference external" href="http://morepypy.blogspot.com/search/label/stm">our blog posts about STM</a>.</p> -</div> -</div> -<div class="section" id="work-plan-and-funding-details"> -<span id="work-plan"></span><h1>Work plan and funding details</h1> -<p>This is an very rough estimate of the amount of work it would take to -complete the steps for an experienced developer who is already familiar -with the PyPy codebase. As before, we cannot guarantee the time -estimates here, but we do agree to report regularly to the community, so -our progress can be followed publicly. We currently expect the duration -of the whole project to be up to two years starting from April 2014.</p> -<p>Paid work will be at $60/hour, but at least one developer who will work -on the project – Armin Rigo – has committed to one hour of volunteer -work per paid hour; and another developer – Remi Meier – is a Ph.D. student -and gets paid from another source already. The total amount of money -that we ask below corresponds roughly to one half-time job.</p> -<p>A 10% general donation will go to the <a class="reference external" href="http://sfconservancy.org/">Software Freedom -Conservancy</a> itself, the non-profit organization of which the PyPy -project is a member and which manages all the issues related to -donations, payments, and tax-exempt status. -An extra fraction of the money collected will be entered into the -general PyPy pot, used for example to finance sprint travel costs to -students. This fraction is 10% maximum, unless more money than -requested is collected, in which case the whole excess will go to -the general PyPy pot.</p> -<p><strong>Note</strong> For donations higher than $1,000, we can arrange for an invoice -and a different payment method to avoid the high Paypal fees. Please -contact pypy at sfconservancy.org if you want to know details on how -to donate via other means.</p> -<div class="section" id="goal-1"> -<h2>Goal 1</h2> -<p>The PyPy-TM that we have in the end of March 2014 is good enough in -some cases to run existing multithreaded code without a GIL, but not in -all of them. There are a number of caveats for the user and missing -optimizations. The goal #1 is to improve this case and address -the caveats. The current status is written down <a class="reference external" href="http://pypy.readthedocs.org/en/latest/stm.html">in the docs</a> and -will evolve over time.</p> -<p>For future reference, at the end of March the main identified issues -are:</p> -<ul class="simple"> -<li>There are still a number of bugs.</li> -<li>The JIT warm-up time is abysmal.</li> -<li>The GC is missing a number of optimizations that are present in -a regular PyPy.</li> -<li>Destructors are not supported (<tt class="docutils literal">__del__()</tt> methods).</li> -<li>The STM bookkeeping logic could see more improvements.</li> -<li>Forking the process is slow.</li> -<li>We don't foresee particularly high conflict rates in regular -multithreaded programs, but this assertion needs to be checked -and possibly some heuristics improved.</li> -</ul> -<p>Fixing all these issues is required before we can confidently say that -PyPy-TM is an out-of-the-box replacement of a regular PyPy which gives -speed-ups over the regular PyPy independently of the Python program it -runs, as long as it is using at least two threads.</p> -</div> -<div class="section" id="goal-2"> -<h2>Goal 2</h2> -<p>This goal contains the various new features needed to use multiple cores -without explicitly using multithreading; in other words, the new APIs -and libraries accessible from Python programs that want to make use of -this benefit.</p> -<p>This goal requires good support for very-long-running transactions, -started with the <tt class="docutils literal">with atomic</tt> construct documented <a class="reference external" href="http://pypy.readthedocs.org/en/latest/stm.html">here</a>. This -approach hides the notion of threads from the end programmer, including -all the hard multithreading-related issues. This is not the first -alternative approach to explicit threads; for example, <a class="reference external" href="http://en.wikipedia.org/wiki/OpenMP">OpenMP</a> is one. -However, it is one of the first ones which does not require the code to -be organized in a particular fashion. Instead, it works on any Python -program which has got latent, imperfect parallelism. Ideally, it only -requires that the end programmer identifies where this parallelism is -likely to be found, and communicates it to the system, using some -lightweight library on top of <tt class="docutils literal">with atomic</tt>.</p> -<p>However, this introduces new issues. The main one is that by forcing -transactions to be longer, “conflicts” will become more common, up to -the point of partially or completely offsetting the benefit of using -PyPy-TM in the first place.</p> -<p>So the programmer using PyPy-TM needs a way to get -feedback about what conflicts we get in these long-running transactions, -and where they are produced. A first step will be to implement getting -“tracebacks” that point to the places where the most time is lost. This -could be later integrated into some “profiler”-like variant where we can -navigate the conflicts, either in a live program or based on data logs.</p> -<p>Some of these conflicts can be solved by improving PyPy-TM directly. -The system works on the granularity of objects and doesn't generate -false conflicts, but some conflicts may be regarded as “false” anyway: -these involve most importantly the built-in dictionary type, for which -we would like accesses and writes using independent keys to be truly -independent. Other built-in data structures have a similar issue, like -lists: ideally, writes to different indexes should not cause conflicts; -but more generally, we would need a mechanism, possibly under the -control of the application, to do things like append an item to a list -in a “delayed” manner, to avoid conflicts.</p> -<p>Similarly, we might need a way to delay some I/O: doing it only at the -end of the transaction rather than immediately, in order to prevent the -whole transaction from turning inevitable.</p> -<p>The goal 2 is thus the development of tools to inspect and fix the -causes of conflicts, as well as fixing the ones that are apparent inside -PyPy-TM directly.</p> -</div> -<div class="section" id="goal-3"> -<h2>Goal 3</h2> -<p>The third goal is to look at some existing event-based frameworks (for -example Twisted, Tornado, Stackless, gevent, …) and attempt to make -them use threads and atomic sections internally. We would appreciate -help and feedback from people more involved in these frameworks, of -course.</p> -<p>The idea is to apply the techniques described in the <a class="reference internal" href="#goal-2">goal 2</a> until we -get a version of framework X which can transparently parallelize the -dispatching and execution of multiple events. This might require some slight -reorganization of the core in order to split the I/O and the actual -logic into separate transactions.</p> -</div> -<div class="section" id="funding"> -<h2>Funding</h2> -<p>We forecast that goal 1 and a good chunk of goal 2 should be reached in -around 6 months of work. The remaining parts of goal 2 as well as goal -3 are likely to be more open-ended jobs. We will go with a total -estimate of two years in order to get a final, well-tested PyPy-STM with -stable performance. The amount sought by this fundraising campaign is -USD$80'000, corresponding to one half-time job for 16 months (1200 hours -at $60/hour plus 10% overhead).</p> -</div> -</div> -<div class="section" id="benefits-of-this-work-to-the-python-community-and-the-general-public"> -<h1>Benefits of This Work to the Python Community and the General Public</h1> -<p>Python has become one of the most popular dynamic programming languages in -the world. Web developers, educators, and scientific programmers alike -all value Python because Python code is often more readable and because -Python often increases programmer productivity.</p> -<p>Traditionally, languages like Python ran more slowly than static, compiled -languages; Python developers chose to sacrifice execution speed for ease -of programming. The PyPy project created a substantially improved Python -language implementation, including a fast Just-in-time (JIT) compiler. -The increased execution speed that PyPy provides has attracted many users, -who now find their Python code runs between 2 and 50 times faster under PyPy -than under the reference implementation written in C.</p> -<p>However, in the presence of today's machines with multiple processors, -Python progress lags behind. The issue has been described in the -introduction: developers that really need to use multiple CPUs are -constrained to select and use one of the multi-process solutions that -are all in some way or another hacks requiring extra knowledge and -efforts to use. The focus of the work described in this proposal is to -offer an alternative in the core of the Python language — an -alternative that can naturally integrate with the rest of the program. -This alternative is implemented in PyPy.</p> -<p>PyPy's developers make all PyPy software available to the public without -charge, under PyPy's Open Source copyright license, the permissive MIT -License. PyPy's license assures that PyPy is equally available to -everyone freely on terms that allow both non-commercial and commercial -activity. This license allows for academics, for-profit software -developers, volunteers and enthusiasts alike to collaborate together to -make a better Python implementation for everyone.</p> -<p>PyPy-TM is and continues to be available under the same license. Being -licensed freely to the general public means that opportunities to use, -improve and learn about how Transactional Memory works itself will be -generally available to everyone.</p> -</div> -</div> -<div id="sidebar"> -</div> -</div> -</div> -</div></div></div> -</body> -</html> \ No newline at end of file