Day 0. Import 及 Dir 指令

import & dir

剛啟動時,能夠使用的變數/函數/物件能利用dir來看:

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__',
 '__name__', '__package__', '__spec__']

例如,如果輸入__name__,會得到'__main__',代表目前正在執行的主程式的意思。
比較特別的是,一般內建的物件和指令會藏到__builtins__中,可以dir(__builtins__)來查看。


如果要用其他內建的module(或許可以想成C語言中的library),必須要先import。
例如:我要使用math中的sqrt函數,可以用下面幾種方式引入:

import math
import math as ma
from math import sqrt

以下是引入後,用dir查看的狀況:

1. ['__annotations__', ..., '__spec__', 'math']
2. ['__annotations__', ..., '__spec__', 'ma']
3. ['__annotations__', ..., '__spec__', 'sqrt']

可以看到math, ma, sqrt分別被引入,因此能夠使用了。
但是由於前兩者是引入math這個module(或是ma這個暱稱),因此使用時必須分別用:

math.sqrt(5)
ma.sqrt(5)

而第三個方法因為引入的就是sqrt這個函數本身,因此直接用sqrt(5)就可以了。
當然,也可以用 “from math import *” 這種方式將整個math的內容引入進來。

指令的執行時間測量

指令的執行時間測量是滿常用來檢查程式碼的一種方式。
可以用timeit這個內建module來做簡短的測試。
以下是從網路上找的範例做些修改的片段:

from timeit import Timer  

s = Timer('sqrt(1000.)','from math import sqrt').timeit()  
print("Square root(Math):\t", str(s))

這些動作等同於先建立一個Timer (class)的實體,其中要執行的statement是‘sqrt(1000)’。
後面的‘from math import sqrt’是執行statement以前的初始化動作,

因為預設的狀態下,Timer執行時和目前已經引入的modules沒有關係,等於是新的乾淨環境,然後建立完這個物件後再用Timer本身的method, ‘timeit’來計算執行n次以後的時間(單位:秒)。

附帶一提,Timer從3.5版開始,也能以目前所在的環境進行時間測量,將指令改為

from timeit import Timer  
from math import sqrt  

s = Timer( stmt= 'sqrt(1000)', globals=globals() ).timeit()

即可。

結語

兩者有些微的差異,實際測試後可發現後者會略慢。
由此可知,當引入越多的module後,python的運作負擔也會越大,
這對執行速度儘管不大,但確實有些許的影響。

results matching ""

    No results matching ""