使用timeit.Timer()时如何传递函数的参数

2024-05-16 21:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个简单程序的大纲

# some pre-defined constants
A = 1
B = 2

# function that does something critical
def foo(num1, num2):
    # do something

# main program.... do something to A and B
for i in range(20):
    # do something to A and B
    # and update A and B during each iteration

import timeit
t = timeit.Timer(stmt="foo(num1,num2)")  
print t.timeit(5)

我只是不断地得到“全球名字foo没有定义”。。。。。 有人能帮我吗?谢谢!


Tags: andto程序foofunctionsomepredo
3条回答

代码段必须是自包含的-它们不能进行外部引用。必须在语句字符串或设置字符串中定义值:

import timeit

setup = """
A = 1
B = 2

def foo(num1, num2):
    pass

def mainprog():
    global A,B
    for i in range(20):
        # do something to A and B
        foo(A, B)
"""

t = timeit.Timer(stmt="mainprog()" setup=setup)
print(t.timeit(5))

更好的是,重写代码以不使用全局值。

假设您的模块文件名是test.py

# some pre-defined constants
A = 1
B = 2

# function that does something critical
def foo(n, m):
    pass

# main program.... do something to A and B
for i in range(20):
    pass

import timeit
t = timeit.Timer(stmt="test.foo(test.A, test.B)", setup="import test")  
print t.timeit(5)

函数可以在timeit中使用参数。如果这些参数是使用闭包创建的,我们可以通过将它们包装到另一个函数中来添加这些行为。

def foo(num1, num2):
    def _foo():
        # do something to num1 and num2
        pass
    return _foo

A = 1
B = 2

import timeit
t = timeit.Timer(foo(A,B))  
print t.timeit(5)

或者更短,我们可以使用functools.partial而不是显式闭包声明

def foo(num1, num2):
    # do something to num1 and num2
    pass

A = 1
B = 2

import timeit, functools
t = timeit.Timer(functools.partial(foo, A, B)) 
print t.timeit(5)

相关问题 更多 >