[issue42115] Caching infrastructure for the evaluation loop: specialised opcodes
Inada Naoki
report at bugs.python.org
Thu Oct 22 05:37:46 EDT 2020
Inada Naoki <songofacandy at gmail.com> added the comment:
FWIW, php7 is about 5x faster than Python on spectral norm benchmark.
https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php-python3.html
There two major reasons:
* PHP uses scalar type for float and int
* PHP uses type-specialized bytecode (PHP8 will use JIT, but PHP7 dosn't)
Source code is here:
php: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/spectralnorm-php-1.html
Python: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/spectralnorm-python3-8.html
The most hot function is eval_A()
```
def eval_A(i, j): # i and j are int.
ij = i + j
return ij * (ij + 1) // 2 + i + 1
```
And its bytecode:
```
Disassembly of <code object eval_A at 0x107fd8500, file "x.py", line 1>:
2 0 LOAD_FAST 0 (i)
2 LOAD_FAST 1 (j)
4 BINARY_ADD
6 STORE_FAST 2 (ij)
3 8 LOAD_FAST 2 (ij)
10 LOAD_FAST 2 (ij)
12 LOAD_CONST 1 (1)
14 BINARY_ADD
16 BINARY_MULTIPLY
18 LOAD_CONST 2 (2)
20 BINARY_FLOOR_DIVIDE
22 LOAD_FAST 0 (i)
24 BINARY_ADD
26 LOAD_CONST 1 (1)
28 BINARY_ADD
30 RETURN_VALUE
```
My thoughts:
* bytecode specialized for `int op int` will some help.
* there are many incref/decref overhead.
* multi operand bytecode (e.g. BINARY_ADD_FAST_FAST, BINARY_ADD_FAST_CONST, etc) will reduce refcount overhead.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue42115>
_______________________________________
More information about the Python-bugs-list
mailing list