gpt4 book ai didi

python - timeit 值错误 : stmt is neither a string nor callable

转载 作者:太空狗 更新时间:2023-10-30 01:49:54 34 4
gpt4 key购买 nike

我在 Python 中使用 timeit,遇到了一个奇怪的问题。

我定义了一个简单的函数add。当我传递 add 两个字符串参数时,timeit 起作用。但是当我传递 add 两个 int 参数时,它会引发 ValueError: stmt is neither a string nor callable

>>> import timeit
>>> def add(x,y):
... return x + y
...


>>> a = '1'
>>> b = '2'
>>> timeit.timeit(add(a,b))
0.01355926995165646


>>> a = 1
>>> b = 2
>>> timeit.timeit(add(a,b))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda/lib/python3.6/timeit.py", line 233, in timeit
return Timer(stmt, setup, timer, globals).timeit(number)
File "/anaconda/lib/python3.6/timeit.py", line 130, in __init__
raise ValueError("stmt is neither a string nor callable")
ValueError: stmt is neither a string nor callable

为什么参数类型在这里很重要?

最佳答案

您的错误是假设 Python 将表达式 add(a, b) 传递给 timeit()。事实并非如此,add(a, b) 不是字符串,它是一个表达式,因此 Python 执行 add(a, b) 并将该调用的结果传递给 timeit() 调用。

因此对于 add('1', '2'),结果是 '12',一个字符串。将字符串传递给 timeit() 就可以了。但是 add(1, 2)3,一个整数。 timeit(3) 给你一个异常(exception)。当然,'12' 的计时并不是那么有趣,但这是一个产生整数值 12 的有效 Python 表达式:

>>> 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)
3
>>> timeit.timeit(3)
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() 函数,或者 ab,因此您需要使用第二个参数(设置字符串)授予它访问权限。您可以使用 from __main__ import add, a, b 导入 add 函数对象:

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

所以添加整数比添加字符串更快。您可能想尝试使用不同大小的整数和字符串,但添加整数仍然会获得更快的结果。

关于python - timeit 值错误 : stmt is neither a string nor callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54135771/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com