2011-10-03 118 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()) 

明确的是比隐:)