Использование модуля 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()