python基礎內建模組相關
python內建函式:compile()
描述
compile() 函式將一個字串編譯為位元組程式碼。
語法
以下是 compile() 方法的語法:
compile(source, filename, mode[, flags[, dont_inherit]])
引數
- source -- 字串或者AST(Abstract Syntax Trees)物件。。
- filename -- 程式碼檔名稱,如果不是從檔案讀取程式碼則傳遞一些可辨認的值。
- mode -- 指定編譯程式碼的種類。可以指定為 exec, eval, single。
- flags -- 變數作用域,區域性名稱空間,如果被提供,可以是任何對映物件。。
- flags和dont_inherit是用來控制編譯原始碼時的標誌
返回值
返回表示式執行結果。
source_code = \ ''' base_string = 'julyedu.com' def test1(a,b): return a+b def test2(c): x = 7 print(c**2+x) ''' co = compile(source_code,'test_compile.py','exec') exec(co) test1(2,6),test2(7) co.co_code co.__dir__() test1.__code__.co_argcount test2.__code__.co_varnames test2.__code__.co_nlocals
輸出:
['__repr__', '__sizeof__', '__eq__', '__subclasshook__', 'co_cellvars', '__class__', 'co_firstlineno', 'co_consts', '__ge__', '__reduce__', '__reduce_ex__', 'co_flags', '__getattribute__', 'co_filename', 'co_stacksize', 'co_nlocals', '__new__', '__dir__', '__hash__', '__init__', '__format__', '__delattr__', '__doc__', '__ne__', 'co_names', 'co_freevars', '__str__', 'co_lnotab', 'co_kwonlyargcount', 'co_name', 'co_code', 'co_varnames', '__setattr__', '__lt__', '__le__', '__gt__', 'co_argcount']
內建模組二:dis模組主要是用來分析位元組碼的一個內建模組,經常會用到的方法是dis.dis([bytesource]),引數為一個程式碼塊,可以得到這個程式碼塊對應的位元組碼指令序列。
具體可以看這個文件: https://docs.python.org/3/library/dis.html
import dis
dis.dis(co)#反彙編module test_compile
# dis.dis(test1),dis.dis(test2)#反彙編module test_compile下的函式
輸出結果:
Disassembler格式及解讀
- 第一列表示以下幾個指令在py檔案中的行號;
- 第二列是該指令在指令序列co_code裡的偏移量;
- 第三列是指令opcode的名稱,分為有運算元和無運算元兩種,opcode在指令序列中是一個位元組的整數;
- 第四列是運算元oparg,在指令序列中佔兩個位元組,基本都是co_consts或者co_names的下標;
- 第五列帶括號的是運算元說明。
記錄幾個jupyter notebook常用的指令:
前面加!表示呼叫系統本身命令,%表示呼叫jupyter內部魔法命令
%lsmagic 可以看到所有的魔法命令
%quickref 表示所有魔法命令的解釋文件
%config ZMQInteractiveShell.ast_node_interactivity='all' 表示一個可以修改核心選項 ast_note_interactivity,使得 Jupyter 對獨佔一行的所有變數或者語句都自動顯示,這樣你就可以馬上看到多個語句的執行結果了。
%%writefile 直接寫入檔案
%run 直接指令碼執行py檔案
更多jupyter notebook的使用,我還收藏了:https://blog.csdn.net/m0_37870649/article/details/79453005
這位仁兄寫的比較全,可以看看。
幫助的使用
#dir,help,?,??,shift+tab,tab,相關Python的小抄
還有可以將shift+tab 游標在函式上就可以顯示。
在寫一個可以觀察執行中記憶體佔用的程式碼:
lesson = ['2018','2019','2020']
import sys
sys.getrefcount(lesson)
import psutil
def rss():
m = psutil.Process().memory_info()
print(m.rss>>20,'MB') #>>表示輸出小數位
rss()
x = list(range(20000000))
rss()
del x
rss()
輸出結果如下:
垃圾回收的內建函式:gc
import gc
gc.get_count()#看看當前的垃圾的計數
gc.get_threshold()#檢視針對每代自動執行垃圾回收的閾值,可以使用gc.set_threshold重新設定閾值
# 當沒有回收的0代物件個數超過700,即開始0級垃圾回收,
# 當0代垃圾回收超過10次即開始1級垃圾回收,1級垃圾回收清除包括0級垃圾,
# 當1代垃圾回收超過10次,即開始2級垃圾回收,2級垃圾回收清除包括0級,1級垃圾
#垃圾回收機制python預設開啟的,gc.disabled可關閉垃圾回收機制
#而使用gc.collect([generation])顯式手動進行垃圾回收
gc.collect(2)#回收2級垃圾,也可以指定0,1
輸出結果;
格式化訪問的兩種形勢:
格式化訪問一:
str3='http://{}.com'
companyName='julyedu'
str3.format(companyName)
格式化訪問二:
_='Python 3'
str4=f"fstring is new feature of {_}"
str4
第二種是python3的新特性。
輸出結果: