Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: nikola Changeset: r971:8c85569a1071 Date: 2020-01-08 09:38 +0100 http://bitbucket.org/pypy/pypy.org/changeset/8c85569a1071/
Log: fix two typos diff --git a/pages/index.rst b/pages/index.rst --- a/pages/index.rst +++ b/pages/index.rst @@ -41,14 +41,14 @@ .. class:: small -On average, PyPy is **4.4 times faser** than CPython +On average, PyPy is **4.4 times faster** than CPython .. figure:: images/pypy_speed_graph.png :alt: PyPy vs. Python speed comparison graph" :figclass: text-sm PyPy trunk (with JIT) benchmark times normalized to CPython. Smaller is - better. Based on he geometric average of all benchmarks + better. Based on the geometric average of all benchmarks .. raw:: html diff --git a/public/archive.html b/public/archive.html --- a/public/archive.html +++ b/public/archive.html @@ -61,7 +61,7 @@ </header><p>No posts found.</p> </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/blog/index.html b/public/blog/index.html --- a/public/blog/index.html +++ b/public/blog/index.html @@ -64,7 +64,7 @@ </main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/categories/index.html b/public/categories/index.html --- a/public/categories/index.html +++ b/public/categories/index.html @@ -63,7 +63,7 @@ </div> </header></article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/compat.html b/public/compat.html --- a/public/compat.html +++ b/public/compat.html @@ -109,11 +109,11 @@ 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> -<pre class="code python"><a name="rest_code_171ff66a5a8940aea74fd4c766cc746e-1"></a><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> +<pre class="code python"><a name="rest_code_70036feadffb497296ad8b0a7e6a5477-1"></a><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> </pre> <p>The proper fix is</p> -<pre class="code python"><a name="rest_code_6d970e24940243f390d3e2518dab1da7-1"></a><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> -<a name="rest_code_6d970e24940243f390d3e2518dab1da7-2"></a> <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> +<pre class="code python"><a name="rest_code_fa080b8497dc418fa273f6f2e9cc4984-1"></a><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> +<a name="rest_code_fa080b8497dc418fa273f6f2e9cc4984-2"></a> <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> </pre> <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. @@ -127,22 +127,22 @@ <p>Similarly, remember that you must <code class="docutils literal">close()</code> a non-exhausted generator in order to have its pending <code class="docutils literal">finally</code> or <code class="docutils literal">with</code> clauses executed immediately:</p> -<pre class="code python"><a name="rest_code_35bd84f66c384000a4efa36835f2f48f-1"></a><span class="k">def</span> <span class="nf">mygen</span><span class="p">():</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-2"></a> <span class="k">with</span> <span class="n">foo</span><span class="p">:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-3"></a> <span class="k">yield</span> <span class="mi">42</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-4"></a> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-5"></a><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mygen</span><span class="p">():</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-6"></a> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">42</span><span class="p">:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-7"></a> <span class="k">break</span> <span class="c1"># foo.__exit__ is not run immediately!</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-8"></a> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-9"></a><span class="c1"># fixed version:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-10"></a><span class="n">gen</span> <span class="o">=</span> <span class="n">mygen</span><span class="p">()</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-11"></a><span class="k">try</span><span class="p">:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-12"></a> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">gen</span><span class="p">:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-13"></a> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">42</span><span class="p">:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-14"></a> <span class="k">break</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-15"></a><span class="k">finally</span><span class="p">:</span> -<a name="rest_code_35bd84f66c384000a4efa36835f2f48f-16"></a> <span class="n">gen</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> +<pre class="code python"><a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-1"></a><span class="k">def</span> <span class="nf">mygen</span><span class="p">():</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-2"></a> <span class="k">with</span> <span class="n">foo</span><span class="p">:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-3"></a> <span class="k">yield</span> <span class="mi">42</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-4"></a> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-5"></a><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mygen</span><span class="p">():</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-6"></a> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">42</span><span class="p">:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-7"></a> <span class="k">break</span> <span class="c1"># foo.__exit__ is not run immediately!</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-8"></a> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-9"></a><span class="c1"># fixed version:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-10"></a><span class="n">gen</span> <span class="o">=</span> <span class="n">mygen</span><span class="p">()</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-11"></a><span class="k">try</span><span class="p">:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-12"></a> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">gen</span><span class="p">:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-13"></a> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">42</span><span class="p">:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-14"></a> <span class="k">break</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-15"></a><span class="k">finally</span><span class="p">:</span> +<a name="rest_code_a1b6cbdc4e004d87a13d05c47ad77398-16"></a> <span class="n">gen</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> </pre> <p>More generally, <code class="docutils literal">__del__()</code> methods are not executed as predictively as on CPython: they run "some time later" in PyPy (or not at all if @@ -163,7 +163,7 @@ </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/contact.html b/public/contact.html --- a/public/contact.html +++ b/public/contact.html @@ -82,7 +82,7 @@ </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/download.html b/public/download.html --- a/public/download.html +++ b/public/download.html @@ -257,11 +257,11 @@ 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="code bash"><a name="rest_code_eb222efdcc57450f9c01afcce48233ec-1"></a>hg clone https://bitbucket.org/pypy/pypy +<pre class="code bash"><a name="rest_code_c1f6a57f6dc145cf9d0be6cc55504407-1"></a>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="code bash"><a name="rest_code_85d4249d66294887b619ae00370a5a1a-1"></a><span class="c1"># switch to the branch that implements Python 3.6</span> -<a name="rest_code_85d4249d66294887b619ae00370a5a1a-2"></a>hg update py3.6 +<pre class="code bash"><a name="rest_code_db060d4350a7428cbd3ae2ce693c5595-1"></a><span class="c1"># switch to the branch that implements Python 3.6</span> +<a name="rest_code_db060d4350a7428cbd3ae2ce693c5595-2"></a>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> @@ -275,19 +275,19 @@ </li> <li> <p>Enter the <code class="docutils literal">goal</code> directory:</p> -<pre class="code bash"><a name="rest_code_5322dcf80b114303b4e460f5a48867ff-1"></a><span class="nb">cd</span> pypy/pypy/goal +<pre class="code bash"><a name="rest_code_cbfc2282773844319735dc5bd20ffd1a-1"></a><span class="nb">cd</span> pypy/pypy/goal </pre> </li> <li> <p>Run the <code class="docutils literal">rpython</code> script. Here are the common combinations of options (works also with <code class="docutils literal">python</code> instead of <code class="docutils literal">pypy</code>; requires CPython 2.7 or PyPy 2, even to build PyPy 3):</p> -<pre class="code bash"><a name="rest_code_ad08c81eebce4adda7a757d2b555e51b-1"></a><span class="c1"># get the JIT version</span> -<a name="rest_code_ad08c81eebce4adda7a757d2b555e51b-2"></a>pypy ../../rpython/bin/rpython -Ojit targetpypystandalone -<a name="rest_code_ad08c81eebce4adda7a757d2b555e51b-3"></a><span class="c1"># get the no-jit version</span> -<a name="rest_code_ad08c81eebce4adda7a757d2b555e51b-4"></a>pypy ../../rpython/bin/rpython -O2 targetpypystandalone -<a name="rest_code_ad08c81eebce4adda7a757d2b555e51b-5"></a><span class="c1"># get the sandbox version</span> -<a name="rest_code_ad08c81eebce4adda7a757d2b555e51b-6"></a>pypy ../../rpython/bin/rpython -O2 --sandbox targetpypystandalone +<pre class="code bash"><a name="rest_code_7f73c5eee7ec4910a08037efbd3341cf-1"></a><span class="c1"># get the JIT version</span> +<a name="rest_code_7f73c5eee7ec4910a08037efbd3341cf-2"></a>pypy ../../rpython/bin/rpython -Ojit targetpypystandalone +<a name="rest_code_7f73c5eee7ec4910a08037efbd3341cf-3"></a><span class="c1"># get the no-jit version</span> +<a name="rest_code_7f73c5eee7ec4910a08037efbd3341cf-4"></a>pypy ../../rpython/bin/rpython -O2 targetpypystandalone +<a name="rest_code_7f73c5eee7ec4910a08037efbd3341cf-5"></a><span class="c1"># get the sandbox version</span> +<a name="rest_code_7f73c5eee7ec4910a08037efbd3341cf-6"></a>pypy ../../rpython/bin/rpython -O2 --sandbox targetpypystandalone </pre> </li> <li><p>Enjoy Mandelbrot <code class="docutils literal"><span class="pre">:-)</span></code> It takes on the order of half an hour to @@ -320,9 +320,9 @@ call it with <code class="docutils literal"><span class="pre">...pypy-c</span> <span class="pre">../../rpython/bin/rpython</span> <span class="pre">-Ojit</span></code>.</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="code bash"><a name="rest_code_77ce200d788b4103830bd644a28a8433-1"></a><span class="nv">PYPY_DONT_RUN_SUBPROCESS</span><span class="o">=</span><span class="m">1</span> <span class="nv">PYPY_GC_MAX_DELTA</span><span class="o">=</span>200MB <span class="se">\</span> -<a name="rest_code_77ce200d788b4103830bd644a28a8433-2"></a>pypy --jit <span class="nv">loop_longevity</span><span class="o">=</span><span class="m">300</span> ../../rpython/bin/rpython -Ojit --source -<a name="rest_code_77ce200d788b4103830bd644a28a8433-3"></a><span class="c1"># then read the next point about --source</span> +<pre class="code bash"><a name="rest_code_1d541122efac4444b614f7d18e9d1fe5-1"></a><span class="nv">PYPY_DONT_RUN_SUBPROCESS</span><span class="o">=</span><span class="m">1</span> <span class="nv">PYPY_GC_MAX_DELTA</span><span class="o">=</span>200MB <span class="se">\</span> +<a name="rest_code_1d541122efac4444b614f7d18e9d1fe5-2"></a>pypy --jit <span class="nv">loop_longevity</span><span class="o">=</span><span class="m">300</span> ../../rpython/bin/rpython -Ojit --source +<a name="rest_code_1d541122efac4444b614f7d18e9d1fe5-3"></a><span class="c1"># then read the next point about --source</span> </pre> </li> <li><p>You can run translations with <code class="docutils literal"><span class="pre">--source</span></code>, which only builds the C @@ -343,9 +343,9 @@ <p>Once PyPy is translated from source the binary package similar to those provided in the section <a class="reference internal" href="download.html#default-with-a-jit-compiler">Default (with a JIT Compiler)</a> above could be easily created with <code class="docutils literal">package.py</code> script:</p> -<pre class="code bash"><a name="rest_code_a0dd03f8836b440982e9ed4bcd9d5999-1"></a><span class="nb">cd</span> ./pypy/pypy/tool/release/ -<a name="rest_code_a0dd03f8836b440982e9ed4bcd9d5999-2"></a>python package.py --help <span class="c1">#for information</span> -<a name="rest_code_a0dd03f8836b440982e9ed4bcd9d5999-3"></a>python package.py --archive-name pypy-my-own-package-name +<pre class="code bash"><a name="rest_code_8bbac17aef5e4c6583369269ff7919bd-1"></a><span class="nb">cd</span> ./pypy/pypy/tool/release/ +<a name="rest_code_8bbac17aef5e4c6583369269ff7919bd-2"></a>python package.py --help <span class="c1">#for information</span> +<a name="rest_code_8bbac17aef5e4c6583369269ff7919bd-3"></a>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 @@ -455,7 +455,7 @@ </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/features.html b/public/features.html --- a/public/features.html +++ b/public/features.html @@ -157,16 +157,16 @@ build <code class="docutils literal"><span class="pre">pypy-sandbox</span></code> from it (see <a class="reference external" href="download.html#building-from-source">Building from source</a>). These instructions give you a <code class="docutils literal"><span class="pre">pypy-c</span></code> that you should rename to <code class="docutils literal"><span class="pre">pypy-sandbox</span></code> to avoid future confusion. Then run:</p> -<pre class="code bash"><a name="rest_code_8e62c9019a8d4f5285cd3e9e15afe580-1"></a><span class="nb">cd</span> pypy/sandbox -<a name="rest_code_8e62c9019a8d4f5285cd3e9e15afe580-2"></a>pypy_interact.py path/to/pypy-sandbox -<a name="rest_code_8e62c9019a8d4f5285cd3e9e15afe580-3"></a><span class="c1"># don't confuse it with pypy/goal/pyinteractive.py!</span> +<pre class="code bash"><a name="rest_code_d8a8660498ac4e2f88a5b8fcf70faaa8-1"></a><span class="nb">cd</span> pypy/sandbox +<a name="rest_code_d8a8660498ac4e2f88a5b8fcf70faaa8-2"></a>pypy_interact.py path/to/pypy-sandbox +<a name="rest_code_d8a8660498ac4e2f88a5b8fcf70faaa8-3"></a><span class="c1"># don't confuse it with pypy/goal/pyinteractive.py!</span> </pre> <p>You get a fully sandboxed interpreter, in its own filesystem hierarchy (try <code class="docutils literal"><span class="pre">os.listdir('/')</span></code>). For example, you would run an untrusted script as follows:</p> -<pre class="code bash"><a name="rest_code_d48bb7a9ea1d499c9f2cb67b35ca403f-1"></a>mkdir virtualtmp -<a name="rest_code_d48bb7a9ea1d499c9f2cb67b35ca403f-2"></a>cp untrusted.py virtualtmp/ -<a name="rest_code_d48bb7a9ea1d499c9f2cb67b35ca403f-3"></a>pypy_interact.py --tmp<span class="o">=</span>virtualtmp pypy-sandbox /tmp/untrusted.py +<pre class="code bash"><a name="rest_code_c0777f208eeb440cb2a30c4791d5446d-1"></a>mkdir virtualtmp +<a name="rest_code_c0777f208eeb440cb2a30c4791d5446d-2"></a>cp untrusted.py virtualtmp/ +<a name="rest_code_c0777f208eeb440cb2a30c4791d5446d-3"></a>pypy_interact.py --tmp<span class="o">=</span>virtualtmp pypy-sandbox /tmp/untrusted.py </pre> <p>Note that the path <code class="docutils literal">/tmp/untrusted.py</code> is a path inside the sandboxed filesystem. You don't have to put <code class="docutils literal">untrusted.py</code> in the real <code class="docutils literal">/tmp</code> @@ -180,7 +180,7 @@ </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/index.html b/public/index.html --- a/public/index.html +++ b/public/index.html @@ -20,15 +20,12 @@ <meta property="og:site_name" content="PyPy"> <meta property="og:title" content="Welcome to PyPy"> <meta property="og:url" content="https://www.pypy.org/"> -<meta property="og:description" content="A fast, compliant alternative implementation of Python +<meta property="og:description" content='A fast, compliant alternative implementation of Python Get Started : Download and install What is PyPy : Features Documentation (external link) - -On average, PyPy is 4.4 times faser than CPython - - -PyPy"> +"If you want your code to run faster, +you should probabl'> <meta property="og:type" content="article"> <meta property="article:published_time" content="2019-12-28T16:14:02Z"> </head> @@ -75,25 +72,20 @@ </header><div class="e-content entry-content" itemprop="articleBody text"> - <div> -<div class="row"> + <div class="row"> <div class="column pb-4"> <img alt="PyPy logo" src="images/pypy-logo.svg" style="width: 350px;"><p>A <a class="reference external" href="http://speed.pypy.org/">fast</a>, <a class="reference external" href="compat.html">compliant</a> alternative implementation of <a class="reference external" href="http://python.org/">Python</a></p> <p class="button"><a class="reference external" href="download.html">Get Started</a> : Download and install</p> <p class="button"><a class="reference external" href="features.html">What is PyPy</a> : Features</p> <p class="button"><a class="reference external" href="https://doc.pypy.org">Documentation</a> (external link)</p> -</div> -<div class="column pb-4"> -<p class="small">On average, PyPy is <strong>4.4 times faser</strong> than CPython</p> -<div class="text-sm figure"> -<img alt='PyPy vs. Python speed comparison graph"' src="images/pypy_speed_graph.png"><p class="caption">PyPy trunk (with JIT) benchmark times normalized to CPython. Smaller is -better. Based on he geometric average of all benchmarks</p> -</div> -</div> -</div> <pre class="literal-block">"If you want your code to run faster, you should probably just use PyPy." -- Guido van Rossum (creator of Python)</pre> +<p>On average, PyPy is <strong>4.4 times faster</strong> than CPython</p> +<div class="text-sm figure"> +<img alt='PyPy vs. Python speed comparison graph"' src="images/pypy_speed_graph.png"><p class="caption">PyPy trunk (with JIT) benchmark times normalized to CPython. Smaller is +better. Based on the geometric average of all benchmarks</p> +</div> <p><strong>Advantages and distinct Features</strong></p> <ul class="simple"> <li><p><strong>Speed:</strong> thanks to its Just-in-Time compiler, Python programs @@ -108,11 +100,12 @@ <li><p>As well as other <a class="reference external" href="features.html">features</a>.</p></li> </ul> </div> +</div> </div> </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/index.rst b/public/index.rst --- a/public/index.rst +++ b/public/index.rst @@ -34,32 +34,22 @@ .. _`What is PyPy`: features.html .. _`Documentation`: https://doc.pypy.org -.. raw:: html - </div> - <div class="column pb-4" "flex-basis: 400px"> +:: -.. class:: small + "If you want your code to run faster, + you should probably just use PyPy." + -- Guido van Rossum (creator of Python) -On average, PyPy is **4.4 times faser** than CPython +On average, PyPy is **4.4 times faster** than CPython .. figure:: images/pypy_speed_graph.png :alt: PyPy vs. Python speed comparison graph" :figclass: text-sm PyPy trunk (with JIT) benchmark times normalized to CPython. Smaller is - better. Based on he geometric average of all benchmarks + better. Based on the geometric average of all benchmarks -.. raw:: html - - </div> - </div> - -:: - - "If you want your code to run faster, - you should probably just use PyPy." - -- Guido van Rossum (creator of Python) **Advantages and distinct Features** diff --git a/public/people.html b/public/people.html --- a/public/people.html +++ b/public/people.html @@ -188,7 +188,7 @@ </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/performance.html b/public/performance.html --- a/public/performance.html +++ b/public/performance.html @@ -235,13 +235,13 @@ <div class="section" id="string-concatenation-is-expensive"> <h3>String concatenation is expensive</h3> <p>In CPython, you may want to replace:</p> -<pre class="code python"><a name="rest_code_ce6361ac82b941c2baf7683e62801171-1"></a><span class="n">s</span> <span class="o">=</span> <span class="n">head</span> <span class="o">+</span> <span class="n">body</span> <span class="o">+</span> <span class="n">maybe</span> <span class="o">+</span> <span class="n">tail</span> +<pre class="code python"><a name="rest_code_932017a3c2d84bb982ab371c27785e79-1"></a><span class="n">s</span> <span class="o">=</span> <span class="n">head</span> <span class="o">+</span> <span class="n">body</span> <span class="o">+</span> <span class="n">maybe</span> <span class="o">+</span> <span class="n">tail</span> </pre> <p>with the admittedly less readable:</p> -<pre class="code python"><a name="rest_code_c50435e403854b8eac9c35780c72b6d8-1"></a><span class="n">s</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(head)s%(body)s%(maybe)s%(tail)s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">locals</span><span class="p">()</span> +<pre class="code python"><a name="rest_code_69e68d1d51ff463ebd512343ae0ab687-1"></a><span class="n">s</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(head)s%(body)s%(maybe)s%(tail)s</span><span class="s2">"</span> <span class="o">%</span> <span class="nb">locals</span><span class="p">()</span> </pre> <p>or even:</p> -<pre class="code python"><a name="rest_code_45df624352d84e12a607edff5600123f-1"></a><span class="n">s</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{head}{body}{maybe}{tail}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="nb">locals</span><span class="p">())</span> +<pre class="code python"><a name="rest_code_173ee5bb4c34441bb6e1ea4a45e617ca-1"></a><span class="n">s</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{head}{body}{maybe}{tail}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="nb">locals</span><span class="p">())</span> </pre> <p>Both of the latter forms avoid multiple-allocation overhead. But PyPy's JIT makes the overhead of intermediate concatenations @@ -249,8 +249,8 @@ small, bound and constant. (And <code class="docutils literal">locals()</code> 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="code python"><a name="rest_code_98503b81c63d4dbe8a95eb4b488622a2-1"></a><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span> -<a name="rest_code_98503b81c63d4dbe8a95eb4b488622a2-2"></a> <span class="n">s</span> <span class="o">+=</span> <span class="n">foo</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> +<pre class="code python"><a name="rest_code_18614ba6a1144dd39058438e85bdf56d-1"></a><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span> +<a name="rest_code_18614ba6a1144dd39058438e85bdf56d-2"></a> <span class="n">s</span> <span class="o">+=</span> <span class="n">foo</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> </pre> <p>the JIT cannot optimize out intermediate copies. This code is actually quadratic in the total size of the mylist strings due to @@ -258,10 +258,10 @@ is always fine for bytearrays, because in this case <code class="docutils literal">+=</code> is an in-place operation.)</p> <p>This:</p> -<pre class="code python"><a name="rest_code_577f1ce781034a32aa3369ac2ae4572b-1"></a><span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span> -<a name="rest_code_577f1ce781034a32aa3369ac2ae4572b-2"></a><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span> -<a name="rest_code_577f1ce781034a32aa3369ac2ae4572b-3"></a> <span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">foo</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> -<a name="rest_code_577f1ce781034a32aa3369ac2ae4572b-4"></a><span class="n">s</span> <span class="o">=</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> +<pre class="code python"><a name="rest_code_ac7860eb3b5340cbb49fa7f1f237b9b9-1"></a><span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span> +<a name="rest_code_ac7860eb3b5340cbb49fa7f1f237b9b9-2"></a><span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span> +<a name="rest_code_ac7860eb3b5340cbb49fa7f1f237b9b9-3"></a> <span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">foo</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> +<a name="rest_code_ac7860eb3b5340cbb49fa7f1f237b9b9-4"></a><span class="n">s</span> <span class="o">=</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> </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 @@ -373,7 +373,7 @@ </article></main><footer id="footer"><p> <img src="images/pypy-logo-nav-grey.png" alt="PyPy Logo"> Contents © -2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> +2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> Powered by <a href="https://getnikola.com" rel="nofollow">Nikola</a> </p> </footer> diff --git a/public/rss.xml b/public/rss.xml --- a/public/rss.xml +++ b/public/rss.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8"?> -<?xml-stylesheet type="text/xsl" href="assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PyPy</title><link>https://www.pypy.org/</link><description>A Faster Python</description><atom:link href="https://www.pypy.org/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2019 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> </copyright><lastBuildDate>Mon, 30 Dec 2019 07:43:17 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs></channel></rss> \ No newline at end of file +<?xml-stylesheet type="text/xsl" href="assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PyPy</title><link>https://www.pypy.org/</link><description>A Faster Python</description><atom:link href="https://www.pypy.org/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2020 <a href="mailto:pypy-...@pypy.org">The PyPy Team</a> </copyright><lastBuildDate>Wed, 08 Jan 2020 08:33:50 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs></channel></rss> \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -7,42 +7,42 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> <url> <loc>https://www.pypy.org/</loc> - <lastmod>2019-12-30T13:22:00Z</lastmod> + <lastmod>2020-01-08T08:35:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/archive.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/blog/</loc> - <lastmod>2019-12-30T07:43:00Z</lastmod> + <lastmod>2020-01-08T05:16:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/categories/</loc> - <lastmod>2019-12-30T07:43:00Z</lastmod> + <lastmod>2020-01-08T05:16:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/compat.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/contact.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/download.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/features.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/people.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> <url> <loc>https://www.pypy.org/performance.html</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </url> </urlset> \ No newline at end of file diff --git a/public/sitemapindex.xml b/public/sitemapindex.xml --- a/public/sitemapindex.xml +++ b/public/sitemapindex.xml @@ -7,10 +7,10 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> <sitemap> <loc>https://www.pypy.org/rss.xml</loc> - <lastmod>2019-12-30T07:43:00Z</lastmod> + <lastmod>2020-01-08T08:33:00Z</lastmod> </sitemap> <sitemap> <loc>https://www.pypy.org/sitemap.xml</loc> - <lastmod>2019-12-30T13:28:00Z</lastmod> + <lastmod>2020-01-08T08:35:00Z</lastmod> </sitemap> </sitemapindex> \ No newline at end of file _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit