Background
Since I have covered some of python topics already I thought it would be a nice time to understand how Python actually worked. There is s common misconception that python is a purely interpreted language. We will see how it actually works now.
How Python works?
Python like Java is first compiled into byte codes which is the interpreted by Python VM by running an interpreter.
- When a module is imported for the first time, or when the source is more recent than the current compiled file, a .pyc file containing the compiled code will usually be created in the same directory as the .py file. When you run the program next time, Python uses this file to skip the compilation step.
- Running a script is not considered an import and no .pyc will be created. For example, if you have a script file abc.py that imports another module xyz.py, when you run abc, xyz.pyc will be created since xyz is imported, but no abc.pyc file will be created since abc.py isn’t being imported.
- You can manually compile your source file using compileall module. You can just say python -m compileall -l test.py and that should create your compiled .pyc file under a directory called __pycache__ under your current directory. Thereafter you can directly run this .pyc file using python test.cpython-34.pyc (All of this is captured below in the screenshot)
As I mentioned before the imported modules are automatically compiled for further use. Lets see how that works out.
In my current folder I have two py files
- test.py and
- testlib.py
testlib.py has a method called
helloworld which simply prints
"Hello World!" to the console.
It's contents are as follows
test.py
import testlib
print("Test Python Module")
testlib.helloworld()
testlib.py
def helloworld():
print("Hello World!")
Now lets run our test.py and see the results. You will see the output and also see a __pycache__ directory getting create under current directory with compile testlib.pyc file. All of this is captured is screenshot below
Note : Only difference is imported modules are compiled to pyc files automatically based on timestamps where as your source files are compiled on the fly. To compile your source files you can use compileall module.
Compiled files with bytecodes are faster to run by python interpreter. Generally .pyc files are the once you ship.
Note : " It's worth noting that while running a compiled script has a faster startup time (as it doesn't need to be compiled), it doesn't run any faster. "
Given above note will help you understand why modules are compiled and not the main source file. Byte compiled modules simply help in faster startup time.
Related Links
- Shutdown hook in Python(OSFG)
- Using Fabric Python command-line tool(OSFG)
- Difference between functions and methods. (OSFG)
- If Python is interpreted, what are .pyc files? (SO)
- How to avoid .pyc files? (SO)
- Difference between Compiler, Interpreter and Assembler (OSFG)
- compileall python module documentation