<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p><br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 2018-01-26 08:18 PM, Chris Barker
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CALGmxELnhhSXVxoeucWk+2KOHG0euyaFAr5ajfrnZtux-PPDSg@mail.gmail.com">
      <div dir="ltr">If there are robust and simple optimizations that
        can be added to CPython, great, but:
        <div><br>
        </div>
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">This mail is the
              consequence of a true story, a story where CPython<br>
              got defeated by Javascript, Java, C# and Go.<br>
            </blockquote>
            <div><br>
            </div>
            <div>at least those last three are statically compiled
              languages -- they are going to be faster than Python for
              this sort of thing -- particularly for code written in a
              non-pythonic style...</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    Java and C#? Statically compiled? Haha.<br>
    <br>
    No.<br>
    <br>
    Java has a bytecode. While yes, Java doesn't need to compile your
    code before running it, the compilation time in CPython is usually
    minimal, unless you're using eval. You can precompile your python
    into bytecode but it's usually not worth it. Java can also load
    bytecode at runtime and do bytecode manipulation stuff.<br>
    <br>
    The only "real" benefit of Java is that object layout is pretty much
    static. (This can be simulated with __slots__ I think? idk.) See
    also, for example:<br>
    <a class="moz-txt-link-freetext" href="http://luajit.org/ext_ffi.html#cdata">http://luajit.org/ext_ffi.html#cdata</a><br>
    <br>
    (The same goes for C#. Idk about Go.)<br>
    <br>
    (Ofc, their JITs do also help. But even with the JIT off, it's still
    pretty good.)<br>
    <br>
    <blockquote type="cite"
cite="mid:CALGmxELnhhSXVxoeucWk+2KOHG0euyaFAr5ajfrnZtux-PPDSg@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">def filter(rule,
              whatever):<br>
                  if rule.x in whatever.x:<br>
                      return True<br>
              <br>
              rules = get_rules()<br>
              whatevers = get_whatevers()<br>
              for rule in rules:<br>
                  for whatever in whatevers:<br>
                      if filter(rule, whatever):<br>
                          cnt = cnt + 1<br>
              <br>
              return cnt<br>
              <br>
               It's true that they didn't optimize the code, but<br>
              they did not for any language having for all of them the
              same cost in<br>
              terms of iterations.<br>
            </blockquote>
            <div><br>
            </div>
            <div>sure, but I would argue that you do need to write code
              in a clean style appropriate for the language at hand.</div>
            <div> </div>
            <div>For instance, the above creates a function that is a
              simple one-liner -- there is no reason to do that, and the
              fact that function calls to have significant overhead in
              Python is going to bite you.</div>
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">for rule in rules:<br>
                  x = rule.x<br>
                  for whatever in whatevers:<br>
                      if x in whatever.x:<br>
                          cnt += 1<br>
              <br>
              The performance of the CPython boosted x3/x4 just doing
              these "silly" things.<br>
            </blockquote>
            <div><br>
            </div>
            <div>"inlining" the filter call is making the code more
              pythonic and readable -- a no brainer. I wouldn't call
              that a optimization.</div>
            <div><br>
            </div>
            <div>making rule.x local is an optimization -- that is, the
              only reason you'd do it to to make the code go faster. how
              much difference did that really make?</div>
            <div><br>
            </div>
            <div>I also don't know what type your "whatevers" are, but
              "x in something" can be order (n) if they re sequences,
              and using a dict or set would be a much better
              performance.</div>
            <div><br>
            </div>
            <div>and perhaps <span
style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0);font-family:Menlo;font-size:11px">collections.Counter </span>would
              help here, too.</div>
            <div><br>
            </div>
            <div>In short, it is a non-goal to get python to run as fast
              as static langues for simple nested loop code like this
              :-)</div>
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">
              The case of the rule cache IMHO is very striking, we have
              plenty<br>
              examples in many repositories where the caching of none
              local<br>
              variables is a widely used pattern, why hasn't been
              considered a way<br>
              to do it implicitly and by default?<br>
            </blockquote>
            <div><br>
            </div>
            <div>you can bet it's been considered -- the Python core
              devs are a pretty smart bunch :-)</div>
            <div><br>
            </div>
            <div>The fundamental reason is that rule.x could change
              inside that loop -- so you can't cache it unless you know
              for sure it won't. -- Again, dynamic language.</div>
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">The case of the
              slowness to call functions in CPython is quite<br>
              recurrent and looks like its an unsolved problem at all.<br>
            </blockquote>
            <div><br>
            </div>
            <div>dynamic language again ...</div>
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex"> If the default code
              that you<br>
              can write in a language is by default slow and exists an
              alternative<br>
              to make it faster, this language is doing something wrong.<br>
            </blockquote>
            <div><br>
            </div>
            <div>yes, that's true -- but your example shouldn't be the
              default code you write in Python.</div>
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">BTW: pypy looks like is
              immunized [1]<br>
              <br>
              [1] <a
                href="https://gist.github.com/pfreixes/d60d00761093c3bdaf29da025a004582"
                rel="noreferrer" target="_blank" moz-do-not-send="true">https://gist.github.com/<wbr>pfreixes/<wbr>d60d00761093c3bdaf29da025a0045<wbr>82</a></blockquote>
            <div><br>
            </div>
            <div>PyPy uses a JIT -- which is the way to make a dynamic
              language run faster -- That's kind of why it exists....</div>
            <div><br>
            </div>
            <div>-CHB</div>
            <div> </div>
          </div>
          <div><br>
          </div>
          -- <br>
          <div class="gmail_signature"><br>
            Christopher Barker, Ph.D.<br>
            Oceanographer<br>
            <br>
            Emergency Response Division<br>
            NOAA/NOS/OR&R            (206) 526-6959   voice<br>
            7600 Sand Point Way NE   (206) 526-6329   fax<br>
            Seattle, WA  98115       (206) 526-6317   main reception<br>
            <br>
            <a href="mailto:Chris.Barker@noaa.gov" target="_blank"
              moz-do-not-send="true">Chris.Barker@noaa.gov</a></div>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Python-ideas mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Python-ideas@python.org">Python-ideas@python.org</a>
<a class="moz-txt-link-freetext" href="https://mail.python.org/mailman/listinfo/python-ideas">https://mail.python.org/mailman/listinfo/python-ideas</a>
Code of Conduct: <a class="moz-txt-link-freetext" href="http://python.org/psf/codeofconduct/">http://python.org/psf/codeofconduct/</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>