New submission from STINNER Victor:

Python 2 has fast path in ceval.c for operations (a+b, a-b, etc.) on small 
integers ("int" type) if the operation does not overflow.

We loose these fast-path in Python 3 when we dropped the int type in favor of 
the long type.

Antoine Pitrou proposed a fast-path, but only for int singletons (integers in 
the range [-5; 255]): issue #10044. His patch was rejected because it 
introduces undefined behaviour.

I propose to reimplemenet Python 2 optimization for long with a single digit, 
which are the most common numbers.

Pseudo-code for BINARY_ADD:
---
if (PyLong_CheckExact(x) && Py_ABS(Py_SIZE(x)) == 1
    && PyLong_CheckExact(y) && Py_ABS(Py_SIZE(y)) == 1)
{
   stwodigits a = ..., b = ...;
   stwodigits c;
   if (... a+b will not overflow ...) { 
      c = a + b;
      return PyLong_FromLongLong(c);
   }
}
/* fall back to PyNumber_Add() */
---

The code can be copied from longobject.c, there are already fast-path for 
single digit numbers. See for example long_mul():
---
    /* fast path for single-digit multiplication */
    if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
        ....
    }
---

As any other optimization, it should be proved to be faster with benchmarks.

----------
messages: 222731
nosy: haypo, mark.dickinson
priority: normal
severity: normal
status: open
title: ceval.c: implement fast path for integers with a single digit
type: performance
versions: Python 3.5

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue21955>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to