SlideShare a Scribd company logo
Diving into Byte-code
    optimization in Python


            SciPy India,
    IIT Bombay Dec 05th 2011
Chetan Giridhar and Vishal Kanaujia
Fundamentals of Bytecode
• Python source code compiled into Python
  byte code by the CPython interpreter
• “.pyc”?
  – Automatic compilation : importing a module
  – Explicit compilation :
    py_compile.compile(“module.py”) – generates
    ‘module.pyc’
• The module ‘compileall’{}


                 Attribution-NonCommercial CC BY-NC
Fundamentals | more
• A program doesn't run any faster when it is
  read from a ‘.pyc’ file. But, why?
• “.pyc” for a script executed on the command
  line
• “.pyc” files – good enough to distribute your
  code, but with a caveat!



                 Attribution-NonCommercial CC BY-NC
Compilation phases
• Uses a ‘lexer’ to prepare tokens of Python
  code
• A parser arranges token according to the
  language grammar and prepares concrete
  syntax tree
• Concrete syntax tree is transformed in to AST
• AST is compiled to produce Byte-codes


                 Attribution-NonCommercial CC BY-NC
Python                                             Abstract
                      Parse Tree
source                                              Syntax
                      generated
 code                                                Tree
            Pgen.c
                                     ast.c


                                       compile.c




Executed
                      Optimized                    Bytecode
by Python
                      bytecode                     generated
   VM
            ceval.c                peephole.c
Python “ast” module
$ cat myast.py                          $python myast.py
                                        <generator object walk at 0xb784c8ec>
import ast
                                        Module(body=[Expr(value=BinOp
nod = ast.parse('a +2')                 (left=Name(id='a', ctx=Load()),
print ast.walk(nod)                     op=Add(),
                                         right=Num(n=2)))])
print ast.dump(nod)




         •Convenient for analysis, code transformations and generation
         •ASTs are compiled to code objects




                             Attribution-NonCommercial CC BY-NC
A peek into Bytecodes
  $ cat scipy.py                           $ python scipy.py
   1 import dis                             4    0 LOAD_CONST       1 (10)
                                                 3 STORE_FAST       0 (i)
   2
   3 def foo():                             5     6 LOAD_FAST       0 (i)
                                                 9 PRINT_ITEM
   4 i = 10                                      10 PRINT_NEWLINE
   5 print i                                     11 LOAD_CONST      0 (None)
                                                 14 RETURN_VALUE
   6
   7 print dis.dis(foo)


• Bytecode stream: An opcode mix
• Defined in “Python-2.7.2/Include/opcode.h”
                          Attribution-NonCommercial CC BY-NC
Python VM
• Engine to execute Bytecodes
• CPython VM is a C implementation
• Stack based process VM
  – PUSH/ POP operations
• Implementation of Python VM?




                Attribution-NonCommercial CC BY-NC
Python VM: Implementation
                                                          Python/ceval.c
                                                          --> PyEval_EvalFrameEx()
for(; ;) {
       /* Extract opcode and argument */
            opcode = NEXTOP();
            if (HAS_ARG(opcode))
                oparg = NEXTARG();
                switch(opcode) {
                     case LOAD_CONST:
                            ……
                 }
    }
                     Attribution-NonCommercial CC BY-NC
Optimizations


                                Tools
    Getting in to the Problem Space!!




             Attribution-NonCommercial CC BY-NC
Pyrex
• Python like language to create C module for
  Python
• Create your “pyx” files and compile them in “.c”
  files
• Import them as modules in your applications
• Pyrex used as:
  – speed up the execution of Python code
  – Python interface to existing C modules/libraries
• Lot of work for developer
  – .py to .pyx?
  – thinking in C

                    Attribution-NonCommercial CC BY-NC
Psyco
• An intelligent option – JIT compilation
• Profiles dynamically an application for hot-
  spots
• “in-memory” prepares C extension and hook
  them appropriately
• Solves “duck” typing
• Memory footprint?
• Support till CPython 2.5

                Attribution-NonCommercial CC BY-NC
Psyco| Intelligent use
                                        Iterations    Without      With
                                                     Pysco(ms)   Pysco(ms)

                                           1000        125         151

                                         100000       12900       12570




• from psyco.classes import *
• pysco.bind(func)

                Attribution-NonCommercial CC BY-NC
Optimizations


                          Bytecode level
    Getting in to the Problem Space!!




            Attribution-NonCommercial CC BY-NC
Why optimize Bytecode?
                                        def foo():
• Python optimization                                 i=0
                                                      i =i+1
  are ineffective,                                    print i

  sometime
                                    4      0 LOAD_CONST          1 (0)
• Duck typing                              3 STORE_FAST          0 (i)

                                    5      6 LOAD_FAST          0 (i)
  – Run-time types                        9 LOAD_CONST          2 (1)
                                          12 BINARY_ADD
  – Optimizer misses                      13 STORE_FAST         0 (i)

    many opportunities              6     16 LOAD_FAST          0 (i)
                                          19 PRINT_ITEM
  – TCO                                   20 PRINT_NEWLINE
                                          21 LOAD_CONST          0 (None)




                 Attribution-NonCommercial CC BY-NC
Optimizations: Tail Recursive Calls
$ cat runbytecode3.py                     $ python runbytecode3.py

import dis                                 5      1 LOAD_CONST           10
                                                  2 STORE_FAST           x

                                           6       4 LOAD_FAST                  x
def foo():                                        5 LOAD_CONST                 10
  x = 10                                          6 COMPARE_OP                 ==
                                                  7 POP_JUMP_IF_FALSE          to 17
  if x == 10:
                                           7      9 LOAD_CONST       0
     x=0                                         10 STORE_FAST       x
     foo()
                                           8   12 LOAD_GLOBAL            foo
                                               13 CALL_FUNCTION           0
                                               14 POP_TOP
print dis.dis(foo)                             15 JUMP_FORWARD            to 17
                                             >> 17 LOAD_CONST            None
                                               18 RETURN_VALUE
                                          None



                        Attribution-NonCommercial CC BY-NC
BytePlay: Do it yourself!
• Experiment with Bytecodes
• Generates, recompiles and runs code on-the-
  fly
• Very useful to evaluate different code
  optimizations
• Example



                Attribution-NonCommercial CC BY-NC
Playing with Bytecode
$cat runbytecode2.py                               $ python runbytecode2.py
                                                   reassembled ‘byteplay.py' imported.
from byteplay import *
from pprint import pprint                           5     1 LOAD_CONST            10 <<<-------------------------
                                                          2 STORE_FAST        x
def foo():
  x = 10                                            6     4 LOAD_FAST     x
                                                          5 PRINT_ITEM
  print x
                                                          6 PRINT_NEWLINE
                                                          7 LOAD_CONST      None
c = Code.from_code(foo.func_code)                         8 RETURN_VALUE
print printcodelist(c.code)                        None

# Modify the byte code                              5     1 LOAD_CONST            1000 <<<---------------------------
c.code[0] = (LOAD_CONST, 1000)                            2 STORE_FAST        x

foo.func_code = c.to_code()                         6     4 LOAD_FAST     x
                                                          5 PRINT_ITEM
print printcodelist(c.code)                               6 PRINT_NEWLINE
                                                          7 LOAD_CONST      None
                                                          8 RETURN_VALUE
# Call the modified function
                                                   None
foo()
                                                   1000




                                    Attribution-NonCommercial CC BY-NC
Going forward


                                PyPy
    Getting in to the Problem Space!!




             Attribution-NonCommercial CC BY-NC
Does PyPy help?
• Python interpreter in Python itself
• A target function needs to be written with
  subset of Python (Restricted Python)
• PyPy can translate this function to runtime of
  your choice ☺
  – Options: C/POSIX, CLI/.NET and Java/JVM
• Seamless and transparent


                 Attribution-NonCommercial CC BY-NC
PyPy | more
from pypy.translator.interactive import                   @compdec
    Translation
                                                          def fact(n):
class compdec:
                                                            if 0 == n:
  def __init__(self, func):                                    return 1
     self.func = func                                       return n * fact(n -1)
     self.argtypes = None                                 fact(10)

  def __call__(self, *args):
    argtypes = tuple(type(arg) for arg in
    args)
    if argtypes != self.argtypes:
       self.argtypes = argtypes
       t = Translation(self.func)
       t.annotate(argtypes)
       self.cfunc = t.compile_c()               What PyPy does?
                                                •The translation of the RPython function to C.
                                                •Invoking the C compiler to create a C extension module.
    return self.cfunc(*args)
                                                •Importing the compiled function back into the Python interpreter.




                                     Attribution-NonCommercial CC BY-NC
Recommendations
• Always profile your applications
• 90/10 rule of performance gain
• Performance critical portion could be written
  as C extensions
  – Wrappers like SWIG could be used to bridge
    Python/C applications
  – Pyrex, Psyco, and PyPy
  – Tuning Bytecodes manually
• Evaluate and use ☺

                  Attribution-NonCommercial CC BY-NC
References
• http://docs.python.org/release/2.5.2/lib/module-dis.html
• http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyre
  x/
• http://www.dalkescientific.com/writings/diary/archive/201
  0/02/22/instrumenting_the_ast.html
• http://cs.utsa.edu/~danlo/teaching/cs4713/lecture/node7.
  html
• http://www.devshed.com/c/a/Python/How-Python-Runs-
  Programs/4/
• http://www.enthought.com/~ischnell/paper.html
• http://codespeak.net/pypy/dist/pypy/doc/translation.html
• http://effbot.org/pyref/type-code.htm

                     Attribution-NonCommercial CC BY-NC
Questions



  Thank you for your time and attention ☺



• Please share your feedback/ comments/ suggestions to us at:
• cjgiridhar@gmail.com ,        http://technobeans.com
• vishalkanaujia@gmail.com,     http://freethreads.wordpress.com

                         Attribution-NonCommercial CC BY-NC
Backup slides




 Attribution-NonCommercial CC BY-NC
Bytecodes | more
• Atomic unit of execution (thread safe)
• A Python module is compiled and saved in
  form of a “pyc” file
• An optimization; avoid compilation phase for
  future uses of a module
• If source file is changed, pyc is recompiled
• “pyc” file is coded in bytecode!


                Attribution-NonCommercial CC BY-NC
Code Objects
• Bytecode representation
• Immutable objects (No ref to mutable objects)
• Function object (Code objects that reference
  global variables)
• “co_code” = Bytecodes




                Attribution-NonCommercial CC BY-NC
Benefits of using Bytecode
• Architecture neutral code
• Portability
• Simple optimizations




                Attribution-NonCommercial CC BY-NC

More Related Content

PDF
Byterun, a Python bytecode interpreter - Allison Kaptur at NYCPython
PDF
Allison Kaptur: Bytes in the Machine: Inside the CPython interpreter, PyGotha...
PDF
Exploring slides
PDF
Bytes in the Machine: Inside the CPython interpreter
PDF
"A 1,500 line (!!) switch statement powers your Python!" - Allison Kaptur, !!...
PDF
Python opcodes
PPTX
TCO in Python via bytecode manipulation.
PDF
All I know about rsc.io/c2go
Byterun, a Python bytecode interpreter - Allison Kaptur at NYCPython
Allison Kaptur: Bytes in the Machine: Inside the CPython interpreter, PyGotha...
Exploring slides
Bytes in the Machine: Inside the CPython interpreter
"A 1,500 line (!!) switch statement powers your Python!" - Allison Kaptur, !!...
Python opcodes
TCO in Python via bytecode manipulation.
All I know about rsc.io/c2go

What's hot (20)

PPT
Python легко и просто. Красиво решаем повседневные задачи
PDF
.NET 2015: Будущее рядом
PDF
Implementing Software Machines in C and Go
PDF
Introducción a Elixir
PDF
Go a crash course
PDF
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
PDF
Faster Python, FOSDEM
PDF
Implementing Software Machines in Go and C
PDF
Functional Programming inside OOP? It’s possible with Python
PDF
Phil Bartie QGIS PLPython
PDF
Что нам готовит грядущий C#7?
PDF
Let's golang
PDF
Welcome to python
PDF
C++の話(本当にあった怖い話)
PDF
Python profiling
ODP
Exploiting Memory Overflows
PPT
Whats new in_csharp4
PDF
Metarhia KievJS 22-Feb-2018
PDF
Implementing virtual machines in go & c 2018 redux
PDF
Are we ready to Go?
Python легко и просто. Красиво решаем повседневные задачи
.NET 2015: Будущее рядом
Implementing Software Machines in C and Go
Introducción a Elixir
Go a crash course
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
Faster Python, FOSDEM
Implementing Software Machines in Go and C
Functional Programming inside OOP? It’s possible with Python
Phil Bartie QGIS PLPython
Что нам готовит грядущий C#7?
Let's golang
Welcome to python
C++の話(本当にあった怖い話)
Python profiling
Exploiting Memory Overflows
Whats new in_csharp4
Metarhia KievJS 22-Feb-2018
Implementing virtual machines in go & c 2018 redux
Are we ready to Go?
Ad

Similar to Diving into byte code optimization in python (20)

PDF
Pydiomatic
PDF
Python idiomatico
PPTX
Overview of Python - Bsides Detroit 2012
PDF
PPTX
Pygrunn 2012 down the rabbit - profiling in python
PDF
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
PDF
Machine vision and device integration with the Ruby programming language (2008)
PDF
Tutorial on-python-programming
PDF
Python speleology
PDF
Programming with Python - Adv.
PDF
Python introduction
PDF
PyPy's approach to construct domain-specific language runtime
PPT
Python study material
PDF
Pythran: Static compiler for high performance by Mehdi Amini PyData SV 2014
PPTX
Down the rabbit hole, profiling in Django
PPTX
Introduction to Python Programming
PDF
Introduction to Python Programming | InsideAIML
KEY
Mypy pycon-fi-2012
PDF
CPython 3.2 SourceCodeReading
PDF
Introduction to Python for Plone developers
Pydiomatic
Python idiomatico
Overview of Python - Bsides Detroit 2012
Pygrunn 2012 down the rabbit - profiling in python
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
Machine vision and device integration with the Ruby programming language (2008)
Tutorial on-python-programming
Python speleology
Programming with Python - Adv.
Python introduction
PyPy's approach to construct domain-specific language runtime
Python study material
Pythran: Static compiler for high performance by Mehdi Amini PyData SV 2014
Down the rabbit hole, profiling in Django
Introduction to Python Programming
Introduction to Python Programming | InsideAIML
Mypy pycon-fi-2012
CPython 3.2 SourceCodeReading
Introduction to Python for Plone developers
Ad

More from Chetan Giridhar (8)

PPTX
Rapid development & integration of real time communication in websites
PPTX
Async programming and python
PPTX
PyCon India 2012: Rapid development of website search in python
PDF
Fuse'ing python for rapid development of storage efficient FS
PPTX
Testers in product development code review phase
PDF
Design patterns in python v0.1
PDF
PyCon India 2011: Python Threads: Dive into GIL!
PPTX
Pycon11: Python threads: Dive into GIL!
Rapid development & integration of real time communication in websites
Async programming and python
PyCon India 2012: Rapid development of website search in python
Fuse'ing python for rapid development of storage efficient FS
Testers in product development code review phase
Design patterns in python v0.1
PyCon India 2011: Python Threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!

Recently uploaded (20)

PDF
KodekX | Application Modernization Development
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Electronic commerce courselecture one. Pdf
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
Big Data Technologies - Introduction.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
A Presentation on Artificial Intelligence
PDF
Modernizing your data center with Dell and AMD
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
KodekX | Application Modernization Development
Reach Out and Touch Someone: Haptics and Empathic Computing
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Spectral efficient network and resource selection model in 5G networks
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Electronic commerce courselecture one. Pdf
MYSQL Presentation for SQL database connectivity
Advanced methodologies resolving dimensionality complications for autism neur...
Building Integrated photovoltaic BIPV_UPV.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Big Data Technologies - Introduction.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
A Presentation on Artificial Intelligence
Modernizing your data center with Dell and AMD
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
The AUB Centre for AI in Media Proposal.docx
Agricultural_Statistics_at_a_Glance_2022_0.pdf

Diving into byte code optimization in python

  • 1. Diving into Byte-code optimization in Python SciPy India, IIT Bombay Dec 05th 2011 Chetan Giridhar and Vishal Kanaujia
  • 2. Fundamentals of Bytecode • Python source code compiled into Python byte code by the CPython interpreter • “.pyc”? – Automatic compilation : importing a module – Explicit compilation : py_compile.compile(“module.py”) – generates ‘module.pyc’ • The module ‘compileall’{} Attribution-NonCommercial CC BY-NC
  • 3. Fundamentals | more • A program doesn't run any faster when it is read from a ‘.pyc’ file. But, why? • “.pyc” for a script executed on the command line • “.pyc” files – good enough to distribute your code, but with a caveat! Attribution-NonCommercial CC BY-NC
  • 4. Compilation phases • Uses a ‘lexer’ to prepare tokens of Python code • A parser arranges token according to the language grammar and prepares concrete syntax tree • Concrete syntax tree is transformed in to AST • AST is compiled to produce Byte-codes Attribution-NonCommercial CC BY-NC
  • 5. Python Abstract Parse Tree source Syntax generated code Tree Pgen.c ast.c compile.c Executed Optimized Bytecode by Python bytecode generated VM ceval.c peephole.c
  • 6. Python “ast” module $ cat myast.py $python myast.py <generator object walk at 0xb784c8ec> import ast Module(body=[Expr(value=BinOp nod = ast.parse('a +2') (left=Name(id='a', ctx=Load()), print ast.walk(nod) op=Add(), right=Num(n=2)))]) print ast.dump(nod) •Convenient for analysis, code transformations and generation •ASTs are compiled to code objects Attribution-NonCommercial CC BY-NC
  • 7. A peek into Bytecodes $ cat scipy.py $ python scipy.py 1 import dis 4 0 LOAD_CONST 1 (10) 3 STORE_FAST 0 (i) 2 3 def foo(): 5 6 LOAD_FAST 0 (i) 9 PRINT_ITEM 4 i = 10 10 PRINT_NEWLINE 5 print i 11 LOAD_CONST 0 (None) 14 RETURN_VALUE 6 7 print dis.dis(foo) • Bytecode stream: An opcode mix • Defined in “Python-2.7.2/Include/opcode.h” Attribution-NonCommercial CC BY-NC
  • 8. Python VM • Engine to execute Bytecodes • CPython VM is a C implementation • Stack based process VM – PUSH/ POP operations • Implementation of Python VM? Attribution-NonCommercial CC BY-NC
  • 9. Python VM: Implementation Python/ceval.c --> PyEval_EvalFrameEx() for(; ;) { /* Extract opcode and argument */ opcode = NEXTOP(); if (HAS_ARG(opcode)) oparg = NEXTARG(); switch(opcode) { case LOAD_CONST: …… } } Attribution-NonCommercial CC BY-NC
  • 10. Optimizations Tools Getting in to the Problem Space!! Attribution-NonCommercial CC BY-NC
  • 11. Pyrex • Python like language to create C module for Python • Create your “pyx” files and compile them in “.c” files • Import them as modules in your applications • Pyrex used as: – speed up the execution of Python code – Python interface to existing C modules/libraries • Lot of work for developer – .py to .pyx? – thinking in C Attribution-NonCommercial CC BY-NC
  • 12. Psyco • An intelligent option – JIT compilation • Profiles dynamically an application for hot- spots • “in-memory” prepares C extension and hook them appropriately • Solves “duck” typing • Memory footprint? • Support till CPython 2.5 Attribution-NonCommercial CC BY-NC
  • 13. Psyco| Intelligent use Iterations Without With Pysco(ms) Pysco(ms) 1000 125 151 100000 12900 12570 • from psyco.classes import * • pysco.bind(func) Attribution-NonCommercial CC BY-NC
  • 14. Optimizations Bytecode level Getting in to the Problem Space!! Attribution-NonCommercial CC BY-NC
  • 15. Why optimize Bytecode? def foo(): • Python optimization i=0 i =i+1 are ineffective, print i sometime 4 0 LOAD_CONST 1 (0) • Duck typing 3 STORE_FAST 0 (i) 5 6 LOAD_FAST 0 (i) – Run-time types 9 LOAD_CONST 2 (1) 12 BINARY_ADD – Optimizer misses 13 STORE_FAST 0 (i) many opportunities 6 16 LOAD_FAST 0 (i) 19 PRINT_ITEM – TCO 20 PRINT_NEWLINE 21 LOAD_CONST 0 (None) Attribution-NonCommercial CC BY-NC
  • 16. Optimizations: Tail Recursive Calls $ cat runbytecode3.py $ python runbytecode3.py import dis 5 1 LOAD_CONST 10 2 STORE_FAST x 6 4 LOAD_FAST x def foo(): 5 LOAD_CONST 10 x = 10 6 COMPARE_OP == 7 POP_JUMP_IF_FALSE to 17 if x == 10: 7 9 LOAD_CONST 0 x=0 10 STORE_FAST x foo() 8 12 LOAD_GLOBAL foo 13 CALL_FUNCTION 0 14 POP_TOP print dis.dis(foo) 15 JUMP_FORWARD to 17 >> 17 LOAD_CONST None 18 RETURN_VALUE None Attribution-NonCommercial CC BY-NC
  • 17. BytePlay: Do it yourself! • Experiment with Bytecodes • Generates, recompiles and runs code on-the- fly • Very useful to evaluate different code optimizations • Example Attribution-NonCommercial CC BY-NC
  • 18. Playing with Bytecode $cat runbytecode2.py $ python runbytecode2.py reassembled ‘byteplay.py' imported. from byteplay import * from pprint import pprint 5 1 LOAD_CONST 10 <<<------------------------- 2 STORE_FAST x def foo(): x = 10 6 4 LOAD_FAST x 5 PRINT_ITEM print x 6 PRINT_NEWLINE 7 LOAD_CONST None c = Code.from_code(foo.func_code) 8 RETURN_VALUE print printcodelist(c.code) None # Modify the byte code 5 1 LOAD_CONST 1000 <<<--------------------------- c.code[0] = (LOAD_CONST, 1000) 2 STORE_FAST x foo.func_code = c.to_code() 6 4 LOAD_FAST x 5 PRINT_ITEM print printcodelist(c.code) 6 PRINT_NEWLINE 7 LOAD_CONST None 8 RETURN_VALUE # Call the modified function None foo() 1000 Attribution-NonCommercial CC BY-NC
  • 19. Going forward PyPy Getting in to the Problem Space!! Attribution-NonCommercial CC BY-NC
  • 20. Does PyPy help? • Python interpreter in Python itself • A target function needs to be written with subset of Python (Restricted Python) • PyPy can translate this function to runtime of your choice ☺ – Options: C/POSIX, CLI/.NET and Java/JVM • Seamless and transparent Attribution-NonCommercial CC BY-NC
  • 21. PyPy | more from pypy.translator.interactive import @compdec Translation def fact(n): class compdec: if 0 == n: def __init__(self, func): return 1 self.func = func return n * fact(n -1) self.argtypes = None fact(10) def __call__(self, *args): argtypes = tuple(type(arg) for arg in args) if argtypes != self.argtypes: self.argtypes = argtypes t = Translation(self.func) t.annotate(argtypes) self.cfunc = t.compile_c() What PyPy does? •The translation of the RPython function to C. •Invoking the C compiler to create a C extension module. return self.cfunc(*args) •Importing the compiled function back into the Python interpreter. Attribution-NonCommercial CC BY-NC
  • 22. Recommendations • Always profile your applications • 90/10 rule of performance gain • Performance critical portion could be written as C extensions – Wrappers like SWIG could be used to bridge Python/C applications – Pyrex, Psyco, and PyPy – Tuning Bytecodes manually • Evaluate and use ☺ Attribution-NonCommercial CC BY-NC
  • 23. References • http://docs.python.org/release/2.5.2/lib/module-dis.html • http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyre x/ • http://www.dalkescientific.com/writings/diary/archive/201 0/02/22/instrumenting_the_ast.html • http://cs.utsa.edu/~danlo/teaching/cs4713/lecture/node7. html • http://www.devshed.com/c/a/Python/How-Python-Runs- Programs/4/ • http://www.enthought.com/~ischnell/paper.html • http://codespeak.net/pypy/dist/pypy/doc/translation.html • http://effbot.org/pyref/type-code.htm Attribution-NonCommercial CC BY-NC
  • 24. Questions Thank you for your time and attention ☺ • Please share your feedback/ comments/ suggestions to us at: • cjgiridhar@gmail.com , http://technobeans.com • vishalkanaujia@gmail.com, http://freethreads.wordpress.com Attribution-NonCommercial CC BY-NC
  • 26. Bytecodes | more • Atomic unit of execution (thread safe) • A Python module is compiled and saved in form of a “pyc” file • An optimization; avoid compilation phase for future uses of a module • If source file is changed, pyc is recompiled • “pyc” file is coded in bytecode! Attribution-NonCommercial CC BY-NC
  • 27. Code Objects • Bytecode representation • Immutable objects (No ref to mutable objects) • Function object (Code objects that reference global variables) • “co_code” = Bytecodes Attribution-NonCommercial CC BY-NC
  • 28. Benefits of using Bytecode • Architecture neutral code • Portability • Simple optimizations Attribution-NonCommercial CC BY-NC