Category: Python-internals

  • Why python 2: negative number cannot be raised to a fractional power, but work on Python 3

    問題是這個樣子的 ➜ cpython git:(84471935ed) ✗ python2 Python 2.7.15 (default, Jun 27 2018, 13:05:28) [GCC 8.1.1 20180531] on linux2 Type “help”, “copyright”, “credits” or “license” for more information. >>> (-1) ** .5 Traceback (most recent call last): File “<stdin>”, line 1, in <module> ValueError: negative number cannot be raised to a fractional power >>> ➜ cpython…

  • Diagnosing and Fixing Reference Leaks in CPython

    Diagnosing and Fixing Reference Leaks in CPython

    CPython’s garbage collection relies on each object’s reference count. Each object has their own reference count, when the object is referenced by others, then we will need to increase object’s reference count by the Py_INCREF macro. In another way, when the referencer don’t need the object anymore, it will need to decrease object’s reference count by the Py_DECREF macro. When object’s…

  • 深入 GIL: 如何寫出快速且 thread-safe 的 Python – Grok the GIL: How to write fast and thread-safe Python

    深入 GIL: 如何寫出快速且 thread-safe 的 Python – Grok the GIL: How to write fast and thread-safe Python

    本文將會探討 Python 內部的 Global Interpreter Lock,以及學習其如何影響 multi-threaded 程式。  原作者:A. Jesse,Twitter: @jessejiryudavis 原文:Grok the GIL: How to write fast and thread-safe Python Louie Lu 經作者同意[1][2]翻譯為正體中文。 當我6歲時,我有一個音樂盒。我將他上緊發條,在上面的芭蕾舞者開始繞圈,而盒子內的機關開始敲打,發出「一閃一閃亮晶晶」的聲音。雖然這東西肯定很廉價,不過我喜歡這個音樂盒,而我想要知道他是怎麼運作的。總之,我打開了這個音樂盒,看到了裏面的裝置 ── 一個我拇指大小的金屬圓筒,安裝得當的讓他可以旋轉,透過凸起的牙齒與鋼梳撞擊後發出音符。 在程式設計師的特點中,關於事情如何運作的好奇心是必不可缺的。當我打開我的音樂盒觀看內部時,我展現我可能是一個 ── 如果不是一個頂尖程式設計師 ── 起碼也會是好奇的一個。 這很奇怪,我在對 Global Interpreter Lock (GIL) 誤解的情況下寫了 Python 程式這麼久,因為我還沒有足夠的好奇心來了解他是如何運作的。我遇到很多人跟我有著同樣的猶豫,以及無知。 該是時候把這個黑盒子翹開了。讓我們閱讀 CPython 原始碼來了解什麼是 GIL,為什麼 Python 會有,以及他是如何影響我們撰寫 multi-threaded 程式。我會給出一些範例來讓你了解 GIL。你會學到如何快速寫出 thread-safe 的 Python,以及如何在 threads 與 processes 之間選擇。…

  • Python Libs – Why “profile” can’t be context manager?

    Python Libs – Why “profile” can’t be context manager?

    Why Python standard library “profile” can’t be context manager like this import profile with profile.Profile(): fib(10)   Zero, what is “profile” module in Python? According to Python 3 Documentation: profile, a pure Python module whose interface is imitated by cProfile, but which adds significant overhead to profiled programs. If you’re trying to extend the profiler…

  • Python 底層運作 02 – PyTokenizer_Get 分析

    當 Python 在讀入程式碼的時候, 第一步就是對程式碼 lexing,將程式碼拆解成 token,標記出每個元素的分類為何。 以下面的程式碼為例: bar = 12345 我們透過 tokenize module 來分析,會變成: $ ./python -m tokenize tests.py 0,0-0,0: ENCODING ‘utf-8’ 1,0-1,3: NAME ‘foo’ 1,4-1,5: OP ‘=’ 1,6-1,11: NUMBER ‘12345’ 1,11-1,12: NEWLINE ‘\n’ 2,0-2,1: NL ‘\n’ 3,0-3,1: NL ‘\n’ 4,0-4,0: ENDMARKER ” 我們可以看到 foo 被標記為 NAME,= 標記為 OP (operator),12345 則被標記為 NUMBER。 在 CPython 中,負責將程式碼標記成 token 的程式碼是 PyTokenizer_Get ,位於 Parser/tokenizer.c。PyTokenizer_Get…

  • Python 底層運作 01 – 虛擬機器與 Byte Code

    Python 底層運作 01 – 虛擬機器與 Byte Code

    你可曾想過這段 Python 程式碼是如何運作的? >>> a = 5 >>> b = 10 >>> c = a * b >>> c 50 Python 作為 interpreted language,其運作可以分為兩個大項,Compiler 以及 Virtual Machine。Compiler 負責將輸入的語法做分析,轉換成 AST (Abstract Syntax Tree),再轉換成 CFG,最後依照 CFG 輸出 bytecode,Code Object 等必要的物件。Virtual Machine 則根據 bytecode 來運行,最後輸出程式運行的結果。 我們可以透過 Python 的 dis 模組,來得知程式碼的 Byte Code 是什麼: ➜ cpython git:(master) ✗ cat tests.py a…