J'aimerais comprendre comment utiliser dis (le dissembleur du bytecode Python) . Plus précisément, comment doit-on interpréter la sortie de dis.dis
(ou dis.disassemble
) ?
.
Voici un exemple très précis (en Python 2.7.3) :
dis.dis("heapq.nsmallest(d,3)")
0 BUILD_SET 24933
3 JUMP_IF_TRUE_OR_POP 11889
6 JUMP_FORWARD 28019 (to 28028)
9 STORE_GLOBAL 27756 (27756)
12 LOAD_NAME 29811 (29811)
15 STORE_SLICE+0
16 LOAD_CONST 13100 (13100)
19 STORE_SLICE+1
Je vois que JUMP_IF_TRUE_OR_POP
etc. sont des instructions en bytecode _(bien que, de manière intéressante, BUILD_SET
n'apparaît pas dans cette liste, bien que je pense qu'il fonctionne comme BUILD_TUPLE
)_ . Je pense que les nombres à droite sont des allocations de mémoire, et que les nombres à gauche sont goto les chiffres... Je remarque qu'ils presque incrémenter par 3 à chaque fois (mais pas tout à fait).
Si j'emballe dis.dis("heapq.nsmallest(d,3)")
à l'intérieur d'une fonction :
def f_heapq_nsmallest(d,n):
return heapq.nsmallest(d,n)
dis.dis("f_heapq(d,3)")
0 BUILD_TUPLE 26719
3 LOAD_NAME 28769 (28769)
6 JUMP_ABSOLUTE 25640
9 <44> # what is <44> ?
10 DELETE_SLICE+1
11 STORE_SLICE+1