Python中的timeit模块运行不正确

3 投票
2 回答
1326 浏览
提问于 2025-04-18 06:36

我正在尝试使用Python的timeit模块,但似乎在timeit的源代码中出现了错误(虽然这听起来不太对)。

这是我运行的代码片段:

def recordCuckoo(amtElements, loadFactor):
    '''
    Determines the average lookup speed in seconds of a cuckoo hash table
    with @amtElements elements and a load factor of @loadFactor
    '''

    mySetup = '''
    import Statistics
    import random
    import hashingLibrary
    from CuckooHashing import *
    '''


    controlStatement = "Statistics.timeCuckooControl(" + str(amtElements) + "," + str(loadFactor) + ")"
    testStatement = "Statistics.timeCuckoo(" + str(amtElements) + "," + str(loadFactor) + ")"

    controlTime = timeit.timeit(controlStatement, setup=mySetup, number=1)
    testTime = timeit.timeit(testStatement, setup=mySetup, number=1)

    lookupTime = (testTime - controlTime)/1000000

    print ("The average lookup time for a cuckoo table with {0} elements and a load factor of {1} was:".format(amtElements, loadFactor))
    print (lookupTime)

    return lookupTime
    if __name__ == "__main__":
        recordCuckoo(100, 0.5)

当我运行它时,收到以下错误信息:

 Traceback (most recent call last):
  File "C:\Python34\CuckooHashing\Statistics.py", line 308, in <module>
    recordCuckoo(100, 0.5)
  File "C:\Python34\CuckooHashing\Statistics.py", line 267, in recordCuckoo
    controlTime = timeit.timeit(controlStatement, setup=mySetup, number=1)
  File "C:\Python34\lib\timeit.py", line 213, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "C:\Python34\lib\timeit.py", line 122, in __init__
    code = compile(src, dummy_src_name, "exec")
  File "<timeit-src>", line 9
    _t0 = _timer()
                 ^
IndentationError: unindent does not match any outer indentation level

我明白这个错误很可能是我自己操作不当造成的,但我收到的错误信息似乎表明在timeit模块中有不正确的空格或制表符。到底发生了什么???

2 个回答

0

以下的测试是成功的:

timeit.timeit('a+3', setup='a=1', number=10000)
timeit.timeit('a+3 -float(2\n)', setup='a=1', number=10000)
timeit.timeit(' a+3 -float(2\n)', setup='a=1', number=10000)

但是这个会出错,显示你的错误信息:

timeit.timeit('a+3', setup=' a=1', number=10000)

注意到在设置中有一个空格。你可以通过使用 mySetup.strip() 来去掉这个空格。

在运行可能出问题的函数之前,打印一下你的变量总是个好主意。不过你说得对,这个错误信息确实让人摸不着头脑。

2

你这样定义你的 mySetup 变量:

mySetup = '''
import Statistics
import random
import hashingLibrary
from CuckooHashing import *
'''

如果只看这一点,其实没什么问题。但是,这些代码实际上是在一个函数的声明里面:

def recordCuckoo(amtElements, loadFactor):
    mySetup = '''
    import Statistics
    import random
    import hashingLibrary
    from CuckooHashing import *
    '''

所以,实际上 mySetup 的内容是这样的:

'''
    import Statistics
    import random
    import hashingLibrary
    from CuckooHashing import *
    '''

你可以看到,在 import 这一行前面有缩进,这样就会导致它们无效(因为这些行本来不应该有缩进)。所以你应该用不同的方式来设置这个变量:

def recordCuckoo(amtElements, loadFactor):
    mySetup = '''
import Statistics
import random
import hashingLibrary
from CuckooHashing import *
'''

或者也可以像这样:

def recordCuckoo(amtElements, loadFactor):
    mySetup = '\n'.join((
        'import Statistics',
        'import random',
        'import hashingLibrary',
        'from CuckooHashing import *'
    ))

撰写回答