Ваша ошибка в том, что Python передает выражение add(a, b)
в timeit()
. Это не так, add(a, b)
не является строкой, это выражение, поэтому Python вместо выполняет add(a, b)
и результат этого вызова передается в вызов timeit()
.
Таким образом, для add('1', '2')
результат будет '12'
, строка. Передача строки в timeit()
это нормально. Но add(1, 2)
- это 12
, целое число. timeit(12)
дает вам исключение. Конечно, не то, чтобы время '12'
было таким интересным, но это допустимое выражение Python, которое выдает целочисленное значение 12:
>>> import timeit
>>> def add(x,y):
... return x + y
...
>>> a = '1'
>>> b = '2'
>>> add(a, b)
'12'
>>> timeit.timeit('12')
0.009553937998134643
>>> a = 1
>>> b = 2
>>> add(a, b)
12
>>> timeit.timeit(12)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../lib/python3.7/timeit.py", line 232, in timeit
return Timer(stmt, setup, timer, globals).timeit(number)
File "/.../lib/python3.7/timeit.py", line 128, in __init__
raise ValueError("stmt is neither a string nor callable")
ValueError: stmt is neither a string nor callable
Это все совершенно нормально; в противном случае, как вы могли бы передать результат функции другой функции напрямую? timeit.timeit()
- это просто еще одна функция Python , ничего особенного, что она отключит нормальную оценку выражений.
Вам нужно передать строку с выражением в timeit()
. timeit()
не имеет доступа к вашей функции add()
, или a
, или b
, поэтому вам нужно предоставить ему доступ со вторым аргументом, строкой установки. Вы можете использовать from __main__ import add, a, b
для импорта функционального объекта ad
:
timeit.timeit('add(a,b)', 'from __main__ import add, a, b')
Теперь вы получаете более значимые результаты:
>>> import timeit
>>> def add(x,y):
... return x + y
...
>>> a = '1'
>>> b = '2'
>>> timeit.timeit('add(a,b)', 'from __main__ import add, a, b')
0.16069997000158764
>>> a = 1
>>> b = 2
>>> timeit.timeit('add(a,b)', 'from __main__ import add, a, b')
0.10841095799696632
Таким образом, добавление целых чисел происходит быстрее, чем добавление строк. Возможно, вы захотите попробовать это с разными размерами целых чисел и строк, но добавление целых чисел останется более быстрым результатом.