4 回答
TA贡献1839条经验 获得超15个赞
您可以在要计时的块之前或之后使用time.time()或time.clock()。
import time
t0 = time.time()
code_block
t1 = time.time()
total = t1-t0
此方法不完全精确timeit(它不会平均运行几次),但是很简单。
time.time()(在Windows和Linux中)和time.clock()(在Linux中)不够精确,无法实现快速功能(total = 0)。在这种情况下,或者如果要平均几次运行所花费的时间,则必须多次手动调用该函数(就像我在示例代码中已经做过的那样,并且在设置其number参数时timeit会自动执行)
import time
def myfast():
code
n = 10000
t0 = time.time()
for i in range(n): myfast()
t1 = time.time()
total_n = t1-t0
如注释中所述,在Windows中,Corey time.clock()具有更高的精度(微秒而不是秒),并且优于time.time()。
TA贡献1735条经验 获得超5个赞
如果您要分析代码并可以使用IPython,则它具有magic函数%timeit。
%%timeit 对细胞进行操作。
In [2]: %timeit cos(3.14)
10000000 loops, best of 3: 160 ns per loop
In [3]: %%timeit
...: cos(3.14)
...: x = 2 + 3
...:
10000000 loops, best of 3: 196 ns per loop
TA贡献1827条经验 获得超7个赞
除了时间之外,您显示的这段代码是完全不正确的:您执行100个连接(完全忽略除最后一个连接之外的所有连接),然后在您执行第一个执行调用时将其传递给局部变量query_stmt,该局部变量仅在执行之后初始化呼叫。
首先,使您的代码正确,而不必担心时间安排:即建立或接收连接并对该连接执行100或500或任意数量的更新的函数,然后关闭该连接。一旦您的代码正常工作,便是考虑在其上使用的正确点timeit!
具体来说,如果要计时的函数是一个无参数的函数,则foobar可以使用timeit.timeit(2.6或更高版本-在2.5及更高版本中更为复杂):
timeit.timeit('foobar()', number=1000)
你最好指定运行的次数,因为默认情况下,上百万,可能是高为您的使用情况(导致该代码;-)花费了大量的时间。
TA贡献1834条经验 获得超8个赞
专注于一件事。磁盘I / O速度很慢,因此如果您要调整的只是数据库查询,那么我将不进行测试。
而且,如果您需要安排数据库执行时间,请改用数据库工具,例如询问查询计划,并注意性能不仅随确切的查询和拥有的索引而变化,还随数据负载(多少数据)而变化。您已存储)。
就是说,您只需将代码放入函数中,然后使用即可运行该函数timeit.timeit():
def function_to_repeat():
# ...
duration = timeit.timeit(function_to_repeat, number=1000)
这将禁用垃圾收集,重复调用该function_to_repeat()函数,并使用来计时这些调用的总持续时间timeit.default_timer(),这是您特定平台上最准确的可用时钟。
您应该将设置代码移出重复功能;例如,您应该首先连接到数据库,然后仅对查询进行计时。使用setup参数导入或创建这些依赖项,并将其传递给函数:
def function_to_repeat(var1, var2):
# ...
duration = timeit.timeit(
'function_to_repeat(var1, var2)',
'from __main__ import function_to_repeat, var1, var2',
number=1000)
会抓取globals function_to_repeat,var1并var2从您的脚本中将其每次重复传递给函数。
添加回答
举报