Python评测
我用Python编写了几个模块来生成阶乘,我想测试运行时间。我找到了一个评测示例,并使用该模板评测了我的模块:Python评测,python,profiling,Python,Profiling,我用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
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()
导入配置文件#事实
def main():
x=原始输入(“输入编号:”)
profile.run('fact(int(x));print')
profile.run('factmemorized(int(x));print')
def事实(x):
如果x==0:返回1
elif x<2:返回x
其他:
返回x*事实(x-1)
def事实化(x):
如果x==0:返回1
elif x<2:返回x
dict1=dict()
dict1[0]=1
dict1[1]=1
对于范围(0,x+1)内的i:
如果1.有_键(i):通过
否则:dict1[i]=i*dict1[i-1]
返回dict1[x]
如果名称=“\uuuuu main\uuuuuuuu”:
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
输入数字:10
回溯(最近一次呼叫最后一次):
文件“fact.py”,第32行,在
main()
文件“fact.py”,第7行,在main中
profile.run('fact(int(x));x')
文件“C:\Python27\lib\profile.py”,第70行,正在运行
prof=prof.run(声明)
文件“C:\Python27\lib\profile.py”,第447行,正在运行
返回self.runctx(cmd、dict、dict)
runctx中的文件“C:\Python27\lib\profile.py”,第453行
全局、局部中的exec cmd
文件“”,第1行,在
名称错误:未定义名称“x”
知道我做错了什么吗?蒂亚!
~craig探查器收到一个字符串,他试图解释该字符串。您的字符串是
profile.run('fact(int(x));print')
,其中的x
变量只是字符串的一部分,无法解析为变量。您必须将其值复制到字符串中才能使其生效。试试这个:
profile.run('fact(int(%s)); print' % x)
profile.run('factMemoized(int(%s)); print' % x)
编辑(删除了我的“答案”,因为彼得维克托林的答案更有意义)。但是留下解释为什么它没有像OP预期的那样起作用
查看profile.py(Python 2.7.2)中的代码,我看到类profile的方法如下:
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语句正在为全局和本地字典提供
\uuuuu main\uuuuu.\uuuu dict\uuuuu
,因此profile.run()只能解析在运行应用程序的顶级字典中定义的变量。正如John Gaines Jr.所说,profile.run()
存在一些范围问题。但是,您可以将runctx
与globals()和locals()一起使用,并显式提供上下文:
profile.runctx('fact(int(x)); print', globals(), locals())
显式优于隐式:)您可以使用直接评测代码。您的代码段如下所示:
import region_profiler as rp # pip install region-profiler
rp.install()
def main():
x = raw_input("Enter number: ")
fact(int(x)) # note: direct call
factMemoized(int(x))
@rp.func(asglobal=True)
def fact(x):
if x == 0: return 1
elif x < 2: return x
else:
return x * fact(x-1)
@rp.func(asglobal=True)
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()
import region_profiler as rp#pip install region profiler
rp.安装()
def main():
x=原始输入(“输入编号:”)
事实(int(x))35;注:直接呼叫
工厂化(int(x))
@rp.func(asglobal=True)
def事实(x):
如果x==0:返回1
elif x<2:返回x
其他:
返回x*事实(x-1)
@rp.func(asglobal=True)
def事实化(x):
如果x==0:返回1
elif x<2:返回x
dict1=dict()
dict1[0]=1
dict1[1]=1
对于范围(0,x+1)内的i:
如果1.有_键(i):通过
否则:dict1[i]=i*dict1[i-1]
返回dict1[x]
如果名称=“\uuuuu main\uuuuuuuu”:
main()
样本输出:
name total % of total count min average max
---------------- -------- ---------- ----- -------- -------- --------
<main> 3.601 s 100.00% 1 3.601 s 3.601 s 3.601 s
. fact() 863 us 0.02% 1 863 us 863 us 863 us
. factMemoized() 73.12 us 0.00% 1 73.12 us 73.12 us 73.12 us
name总计占总计数最小值平均值最大值的百分比
---------------- -------- ---------- ----- -------- -------- --------
3.601 s 100.00%1 3.601 s 3.601 s 3.601 s
. 事实()863美国0.02%1 863美国863美国863美国863美国
. 事实化()73.12美元0.00%173.12美元73.12美元73.12美元73.12美元
谢谢@Constantinius!对我来说,这是一个非常好的时刻:)