2011-10-03 119 views
3

我在Python中編寫了幾個模塊用於生成階乘因子,我想測試運行時間。我發現剖析here的例子,我用模板來分析我的模塊:Python剖析

import profile #fact 

def main(): 
    x = raw_input("Enter number: ") 
    profile.run('fact(int(x)); print') 
    profile.run('factMemoized(int(x)); print') 

def fact(x): 
    if x == 0: return 1 
    elif x < 2: return x 
    else: 
     return x * fact(x-1) 

def factMemoized(x): 
    if x == 0: return 1 
    elif x < 2: return x 
    dict1 = dict() 
    dict1[0] = 1 
    dict1[1] = 1 
    for i in range (0, x+1): 
     if dict1.has_key(i): pass 
     else: dict1[i] = i * dict1[i-1] 
    return dict1[x] 

if __name__ == "__main__": 
    main() 

不過,我得到以下錯誤:

Enter number: 10 
Traceback (most recent call last): 
    File "fact.py", line 32, in <module> 
    main() 
    File "fact.py", line 7, in main 
    profile.run('fact(int(x)); x') 
    File "C:\Python27\lib\profile.py", line 70, in run 
    prof = prof.run(statement) 
    File "C:\Python27\lib\profile.py", line 447, in run 
    return self.runctx(cmd, dict, dict) 
    File "C:\Python27\lib\profile.py", line 453, in runctx 
    exec cmd in globals, locals 
    File "<string>", line 1, in <module> 
NameError: name 'x' is not defined 

任何想法,我做錯了什麼? TIA! 〜craig

回答

5

探查器收到一個字符串,他試圖解釋。你的字符串是profile.run('fact(int(x)); print'),裏面的變量x只是字符串的一部分,不能解析爲變量。你必須將它的值複製到字符串中以使其工作。試試這個:

profile.run('fact(int(%s)); print' % x) 
profile.run('factMemoized(int(%s)); print' % x) 
+0

感謝@Constantinius更好!是我的一部分:) – Craig

3

編輯(刪除我的「答案」作爲Petr Viktorin的更好的意義)。但留下解釋爲什麼它沒有按照OP預期的那樣工作。

在profile.py(Python的2.7.2),我看到類檔案的方法,下面看代碼:

def run(self, cmd): 
    import __main__ 
    dict = __main__.__dict__ 
    return self.runctx(cmd, dict, dict) 

def runctx(self, cmd, globals, locals): 
    self.set_cmd(cmd) 
    sys.setprofile(self.dispatcher) 
    try: 
     exec cmd in globals, locals 
    finally: 
     sys.setprofile(None) 
    return self 

在runctx exec語句()被饋送__main__.__dict__兩個全球和本地字典,因此profile.run()將只能解析正在運行的應用程序的頂級字典中定義的變量。

6

正如John Gaines Jr.所說,profile.run()有一些範圍問題。但是,你可以使用runctx與全局()和locals(),並提供明確的背景:

profile.runctx('fact(int(x)); print', globals(), locals()) 

明確的是比隱:)