Использование модуля timeit в функции с аргументами

Пример из документации

def test():
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))

но как вызвать функцию с параметрами, например, такую ​​функцию:

def test(some_object):
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(some_object)

3 ответа

Эээ, если я правильно понял ваш вопрос, вы просто ищете это?

anobj = 42 # where it can be whatever object
def test(foo):
    pass # do something with foo

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test(anobj)", setup="from __main__ import test, anobj"))

Вот одно решение, которое сработало для меня в этой конкретной ситуации, если ваши аргументы не являются потрясающими матрицами или чем-то в этом роде.


Допустим, я хочу протестировать функцию foo (a, b, c) со значениями, которые я инициализировал внутри своей основной функции. Я могу позвонить по следующему без изменения моего кода,

timeit.Timer('foo({},{},{})'.format(a,b,c), "from __main__ import foo")

Если ваши аргументы являются строками, вы должны заново ввести кавычки вокруг значений:

timeit.Timer('foo("{}","{}","{}")'.format(a,b,c), "from __main__ import foo")

В качестве последнего предупреждения вы должны учитывать, что ваши аргументы будут проходить в формате str(), что может привести к потере точности и целостности различных типов. Пожалуйста, проверьте ваши входы, если вы используете этот метод!

Вы хотите использовать:

def main():
    import timeit
    print(timeit.timeit("test(some_object)")) # don't need to use the 'setup'

def test(my_object):
    lst = []
    for i in range(100):
        lst.append(my_object)

if __name__ == '__main__':
    main()
Другие вопросы по тегам