Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8609597
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 12, 20262026-06-12T03:55:06+00:00 2026-06-12T03:55:06+00:00

I would like to understand how to use dis (the dissembler of Python bytecode)

  • 0

I would like to understand how to use dis (the dissembler of Python bytecode). Specifically, how should one interpret the output of dis.dis (or dis.disassemble)?

.

Here is a very specific example (in 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

I see that JUMP_IF_TRUE_OR_POP etc. are bytecode instructions (although interestingly, BUILD_SET does not appear in this list, though I expect it works as BUILD_TUPLE). I think the numbers on the right-hand-side are memory allocations, and the numbers on the left are goto numbers… I notice they almost increment by 3 each time (but not quite).

If I wrap dis.dis("heapq.nsmallest(d,3)") inside a function:

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 
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-12T03:55:07+00:00Added an answer on June 12, 2026 at 3:55 am

    You are trying to disassemble a string containing source code, but that’s not supported by dis.dis in Python 2. With a string argument, it treats the string as if it contained byte code (see the function disassemble_string in dis.py). So you are seeing nonsensical output based on misinterpreting source code as byte code.

    Things are different in Python 3, where dis.dis compiles a string argument before disassembling it:

    Python 3.2.3 (default, Aug 13 2012, 22:28:10) 
    >>> import dis
    >>> dis.dis('heapq.nlargest(d,3)')
      1           0 LOAD_NAME                0 (heapq) 
                  3 LOAD_ATTR                1 (nlargest) 
                  6 LOAD_NAME                2 (d) 
                  9 LOAD_CONST               0 (3) 
                 12 CALL_FUNCTION            2 
                 15 RETURN_VALUE         
    

    In Python 2 you need to compile the code yourself before passing it to dis.dis:

    Python 2.7.3 (default, Aug 13 2012, 18:25:43) 
    >>> import dis
    >>> dis.dis(compile('heapq.nlargest(d,3)', '<none>', 'eval'))
      1           0 LOAD_NAME                0 (heapq)
                  3 LOAD_ATTR                1 (nlargest)
                  6 LOAD_NAME                2 (d)
                  9 LOAD_CONST               0 (3)
                 12 CALL_FUNCTION            2
                 15 RETURN_VALUE        
    

    What do the numbers mean? The number 1 on the far left is the line number in the source code from which this byte code was compiled. The numbers in the column on the left are the offset of the instruction within the bytecode, and the numbers on the right are the opargs. Let’s look at the actual byte code:

    >>> co = compile('heapq.nlargest(d,3)', '<none>', 'eval')
    >>> co.co_code.encode('hex')
    '6500006a010065020064000083020053'
    

    At offset 0 in the byte code we find 65, the opcode for LOAD_NAME, with the oparg 0000; then (at offset 3) 6a is the opcode LOAD_ATTR, with 0100 the oparg, and so on. Note that the opargs are in little-endian order, so that 0100 is the number 1. The undocumented opcode module contains tables opname giving you the name for each opcode, and opmap giving you the opcode for each name:

    >>> opcode.opname[0x65]
    'LOAD_NAME'
    

    The meaning of the oparg depends on the opcode, and for the full story you need to read the implementation of the CPython virtual machine in ceval.c. For LOAD_NAME and LOAD_ATTR the oparg is an index into the co_names property of the code object:

    >>> co.co_names
    ('heapq', 'nlargest', 'd')
    

    For LOAD_CONST it is an index into the co_consts property of the code object:

    >>> co.co_consts
    (3,)
    

    For CALL_FUNCTION, it is the number of arguments to pass to the function, encoded in 16 bits with the number of ordinary arguments in the low byte, and the number of keyword arguments in the high byte.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I would like to understand how object deletion works on python. Here is a
I am developing a Rails application and would like to understand when to use
I think understand the idea of duck typing, and would like to use it
I am using jQueryUI 1.8.14 and I would like to understand how to use
I would like to understand how Simulink simulation engine works. Does it use a
Here I would like to understand the general idea of implementing BOOST_TYPEOF. I mean
i would like to understand how to use the buffer of a read file.
I would like to better understand how to use static field an method in
I would like to understand why you might want to use the global:: prefix.
I would like to understand what Implement Interface Explicitly entails in C# based on

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.