The first two bytes of the .pyc
file are the magic number that tells the version of the bytecodes. The word is stored in little-endian format, and the known values are:
Python version | Decimal | Hexadecimal | Comment |
---|---|---|---|
Python 1.5 | 20121 | 0x994e | |
Python 1.5.1 | 20121 | 0x994e | |
Python 1.5.2 | 20121 | 0x994e | |
Python 1.6 | 50428 | 0x4cc4 | |
Python 2.0 | 50823 | 0x87c6 | |
Python 2.0.1 | 50823 | 0x87c6 | |
Python 2.1 | 60202 | 0x2aeb | |
Python 2.1.1 | 60202 | 0x2aeb | |
Python 2.1.2 | 60202 | 0x2aeb | |
Python 2.2 | 60717 | 0x2ded | |
Python 2.3a0 | 62011 | 0x3bf2 | |
Python 2.3a0 | 62021 | 0x45f2 | |
Python 2.3a0 | 62011 | 0x3bf2 | ! |
Python 2.4a0 | 62041 | 0x59f2 | |
Python 2.4a3 | 62051 | 0x63f2 | |
Python 2.4b1 | 62061 | 0x6df2 | |
Python 2.5a0 | 62071 | 0x77f2 | |
Python 2.5a0 | 62081 | 0x81f2 | ast-branch |
Python 2.5a0 | 62091 | 0x8bf2 | with |
Python 2.5a0 | 62092 | 0x8cf2 | changed WITH_CLEANUP opcode |
Python 2.5b3 | 62101 | 0x95f2 | fix wrong code: for x, in ... |
Python 2.5b3 | 62111 | 0x9ff2 | fix wrong code: x += yield |
Python 2.5c1 | 62121 | 0xa9f2 | fix wrong lnotab with for loops and storing constants that should have been removed |
Python 2.5c2 | 62131 | 0xb3f2 | fix wrong code: for x, in ... in listcomp/genexp |
Python 2.6a0 | 62151 | 0xc7f2 | peephole optimizations and STORE_MAP opcode |
Python 2.6a1 | 62161 | 0xd1f2 | WITH_CLEANUP optimization |
Python 2.7a0 | 62171 | 0xdbf2 | optimize list comprehensions/change LIST_APPEND |
Python 2.7a0 | 62181 | 0xe5f2 | optimize conditional branches: introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE |
Python 2.7a0 | 62191 | 0xeff2 | introduce SETUP_WITH |
Python 2.7a0 | 62201 | 0xf9f2 | introduce BUILD_SET |
Python 2.7a0 | 62211 | 0x03f3 | introduce MAP_ADD and SET_ADD |
Python 3000 | 3000 | 0xb80b | |
3010 | 0xc20b | removed UNARY_CONVERT |
|
3020 | 0xcc0b | added BUILD_SET |
|
3030 | 0xd60b | added keyword-only parameters | |
3040 | 0xe00b | added signature annotations | |
3050 | 0xea0b | print becomes a function |
|
3060 | 0xf40b | PEP 3115 metaclass syntax | |
3061 | 0xf50b | string literals become unicode | |
3071 | 0xff0b | PEP 3109 raise changes | |
3081 | 0x090c | PEP 3137 make __file__ and __name__ unicode |
|
3091 | 0x130c | kill str8 interning | |
3101 | 0x1d0c | merge from 2.6a0, see 62151 | |
3103 | 0x1f0c | __file__ points to source file |
|
Python 3.0a4 | 3111 | 0x270c | WITH_CLEANUP optimization |
Python 3.0a5 | 3131 | 0x3b0c | lexical exception stacking, including POP_EXCEPT |
Python 3.1a0 | 3141 | 0x450c | optimize list, set and dict comprehensions: change LIST_APPEND and SET_ADD , add MAP_ADD |
Python 3.1a0 | 3151 | 0x4f0c | optimize conditional branches: introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE |
Python 3.2a0 | 3160 | 0x580c | add SETUP_WITH , tag: cpython-32 |
Python 3.2a1 | 3170 | 0x620c | add DUP_TOP_TWO , remove DUP_TOPX and ROT_FOUR , tag: cpython-32 |
Python 3.2a2 | 3180 | 0x6c0c | add DELETE_DEREF |
Sources:
- Python/import.c – merged by aix from Python 2.7.2 and Python 3.2.2
- Little endian hex values for comparison first two bytes of Igor Popov’s method added by jimbob