- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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()
函数,或者 a
或 b
,因此您需要使用第二个参数(设置字符串)授予它访问权限。您可以使用 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/
我无法确定以下 ruby 内联救援代码有什么问题 def test_check() p "first st" t = 5 * lsdj rescue return false p "second
在完成准备好的 mysqli$stmt->close() 和 $stmt->free_result() 之间的区别强>声明。 到目前为止我使用: $mysqli = new mysqli(host,u
我正在尝试登录,输入用户名和密码,如果未显示“同意元素”或显示“管理标题元素”,则编写一个条件,然后单击管理元素,但我的代码仅检查我同意元素不存在显示并抛出异常。 driver.get("ente
根据 php 手册,您可以通过询问 $stmt->error 和 $stmt->errno 来检索任何准备好的语句方法中的错误,但是 bind_param 方法似乎从来没有将这些设置为错误,其他人可以
你能帮我编写高效的 Java 代码吗? 逻辑是:我必须读取文件中的第一个有效记录并生成文件名。无效/有效记录由该行的前 2 个字符标识。无效记录的前 2 个字符填充在名为ignoreTrans 的 A
我试图从下面的代码中获取结果,但是没有返回任何结果。 $stmt->execute(array(id)) 未按预期运行。它似乎在其他代码段中工作正常,我已经比较了它们,没有发现任何差异。 $stmt
我正在尝试检查从 cookie 中检索到的 id 是否存在于数据库中,但是这部分代码 $stmt->bind_result($id, $uname); 和 $username = $uname; 按照
我已经准备好阅读所有其他主题,但没有找到解决方案。这是我的代码 $DevolverUser = $_SESSION['DevolverUser']; $DevolverPas
我正在尝试准备一个mysqli查询,但是它在没有给出任何错误的情况下以静默方式失败。 $db_hostname = "test.com"; $db_database = "dbname";
我想知道 1.java中语句关闭的目的 2.如果我没有在程序中提供 stmt.close() 会发生什么 try{ Statement DelQTY=OPConnect.crea
需要帮助来完成这个简单的任务。该 sp 应该提供一个结果集,并将从 MS-Access-Database 报告目的中调用。 表名可变,但以数字 (lsid) 结尾。使用串联。max_prepared_
我有一个带有 echo 的 php 代码来检查它停止的位置(它不会崩溃,但会停止发送 echo 并且不能按预期工作) $stmt=$conexion->prepare("SELECT Email, M
我不明白我做错了什么。 我在 SQL Server 中有一个存储过程,我需要迁移到 MySQL。 当我运行与打印相同的查询时,该查询正在工作,但相同的变量无法生成准备语句,从而导致语法错误。 Erro
我正在我的事件网站上创建搜索过滤器。有 3 个下拉输入:位置、事件类型、日期。 当用户提交搜索过滤器时,表单会发布更改 mysql 查询的值,这将在用户屏幕上显示不同的事件。我无法找到灵活的解决方案。
我如何mysqli::stmt->bind_param在mysql中被视为NULL的东西? 我目前正在使用 $stmt->bind_param('s', 'NULL'); 最佳答案 bind_para
我在此处运行准备 stmt 时遇到语法错误。我尝试手动执行 @c 中的查询并且它有效。不知道为什么 stmt 会给出这个错误。这是我正在使用的代码。 SET @i=24; SET @Bill_mont
当 ($stmt->fetch()) 服务器不会读取过去 if (isset($_POST['join'])) { $selectedgame = $_POST['join']; $stmt = $l
我的代码: $stmt = $user_home->runQuery("SELECT * FROM tbl_users, tbl_products WHERE userID=:uid and crea
我不明白为什么我的函数没有得到结果而只是得到空值。我正在使用 PhpStorm;我的所有连接都很好(Apache、MySQL、PhpMyAdmin),我已经检查过它们,其他其他服务也正常工作。 这是我
这个问题在这里已经有了答案: Why does mysqli num_rows always return 0? (1 个回答) 关闭 6 年前。 我想检查 if ($numRows >= 1) 那
我是一名优秀的程序员,十分优秀!