Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python评测_Python_Profiling - Fatal编程技术网

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

我用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()
导入配置文件#事实
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!对我来说,这是一个非常好的时刻:)