我正在测试以前的一个问题中的以下代码(将列表转换为字典):
single = ['key1', 'value1', 'key2', 'value2', 'key3', 'value3']
if __name__ == '__main__':
from timeit import Timer
print Timer("dict(zip(single[::2], single[1::2]))",
"from __main__ import single").timeit()
print Timer("si = iter(single); dict(izip(si, si))",
"from __main__ import single; from itertools import izip").timeit()
Run Code Online (Sandbox Code Playgroud)
而我不能确定是否使用时,最好的做法timeit是进口izip的Timer的语句或设置(我假设的设置,但最终的结果时间有所不同,这取决于我做的).
无论如何,我只是希望你们在为代码计时等时获得任何额外的见解.(另外,我只是想学习 - 我不会因为过早的优化或任何事情而受苦.)
谢谢.
低于Slice和手动反向操作之间的性能差异.如果是这种情况,那是什么原因?
timeit.timeit("a[::-1]","a=[1,2,3,4,5,6]",number=100)
6.054327968740836e-05
timeit.timeit("[a[i] for i in range(len(a)-1,-1,-1)]","a=[1,2,3,4,5,6]",number=100)
0.0003132152330920235
Run Code Online (Sandbox Code Playgroud) 我需要在可变数量的数据上计时函数的执行时间。
def foo(raw_data):
preprocessed_data = preprocess_data(raw_data)
time = timeit.Timer('module.expensive_func(preprocessed_data)', 'import module').timeit()
Run Code Online (Sandbox Code Playgroud)
但是,preprocessed_data不是全局变量。无法使用导入from __main__。它在此子例程中是本地的。
如何导入data到timeit.Timer环境中?
在我读到的关于timeit的所有地方,我发现只能以这种方式使用变量:
s1 = 'abc'
s2 = 'abc'
timeit.timeit('s1==s2', 'from __main__ import s1, s2', number=10**4)
Run Code Online (Sandbox Code Playgroud)
要么
s1 = 'abc'
s2 = 'abc'
def func():
timeit.time('s1==s2', 'from __main__ import s1,s2', number=10**4)
Run Code Online (Sandbox Code Playgroud)
which means that you can also use timeit.timeit in a function as long as the variables are in the main program. I would like to use timeit.timeit with variables that are within the scope it is in, for example:
def func():
s1 = 'abc'
s2 = 'abc'
timeit.timeit(...)
Run Code Online (Sandbox Code Playgroud)
As you …
我在Python的timeit.Timer(stmt,setup_stmt)中使用setup语句很难.我感谢任何帮助,让我摆脱这个棘手的问题:
所以我的sniplet看起来像这样:
def compare(string1, string2):
# compare 2 strings
if __name__ = '__main__':
str1 = "This string has \n several new lines \n in the middle"
str2 = "This string hasn't any new line, but a single quote ('), in the middle"
t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%s, p2=%s" % (str1,str2))
Run Code Online (Sandbox Code Playgroud)
我不知道如何在变量str1,str2中转义元字符而不改变它们在setup语句中的含义:
"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
Run Code Online (Sandbox Code Playgroud)
我尝试了各种组合,但总是有以下错误:SyntaxError:
扫描单引号字符串时无法分配给文字
语法错误:EOL 语法错误:语法无效
我在一个类的实例中计时函数时遇到了一些麻烦.我不确定我是不是以正确的方式(从未使用过时间),我尝试了第二个参数导入内容的一些变体,但没有运气.这是我正在做的一个愚蠢的例子:
import timeit
class TimedClass():
def __init__(self):
self.x = 13
self.y = 15
t = timeit.Timer("self.square(self.x, self.y)")
try:
t.timeit()
except:
t.print_exc()
def square(self, _x, _y):
print _x**_y
myTimedClass = TimedClass()
Run Code Online (Sandbox Code Playgroud)
哪,跑步时,抱怨自我.
Traceback (most recent call last):
File "timeItTest.py", line 9, in __init__
t.timeit()
File "C:\Python26\lib\timeit.py", line 193, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
self.square(self.x, self.y)
NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)
这与TimeIt创建一个虚拟环境以运行该函数有关,但是我需要传递给第二个参数以使其全部满意?
我正在阅读timeit模块的代码,我注意到了这一段:
gcold = gc.isenabled()
gc.disable()
timing = self.inner(it, self.timer)
if gcold:
gc.enable()
Run Code Online (Sandbox Code Playgroud)
这只是存储垃圾收集的状态(打开或关闭),然后将其关闭.该函数inner执行正在计时的语句.然后它将垃圾收集器恢复到旧状态.
所以我很好奇这是什么意思.如果被测试的代码在垃圾收集器中运行,那么不应该在测试中反映出来吗?我错过了什么?
我最初为定时函数创建了一个自定义函数,如下所示:
def timefunc(function, *args):
start = time.time()
data = function(*args)
end = time.time()
time_taken = end - start
print "Function: "+function.__name__
print "Time taken:",time_taken
return data
Run Code Online (Sandbox Code Playgroud)
现在,了解了timeit模块后,我想用它来实现相同的功能.在发送函数和*args参数时,我无法弄清楚如何做到这一点.我已经发现我必须在setup arg中执行此操作:
"from __main__ import function"
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何处理*args,因为'stmt'和'setup'参数都是字符串,我怎么能传递变量?
文档示例
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"))
Run Code Online (Sandbox Code Playgroud)
但是如何使用参数调用函数,例如,像这样的函数:
def test(some_object):
"""Stupid test function"""
L = []
for i in range(100):
L.append(some_object)
Run Code Online (Sandbox Code Playgroud) 我想测量在Python 3中进行加法运算所需的时钟周期数.
我写了一个程序来计算加法运算的平均值:
from timeit import timeit
def test(n):
for i in range(n):
1 + 1
if __name__ == '__main__':
times = {}
for i in [2 ** n for n in range(10)]:
t = timeit.timeit("test(%d)" % i, setup="from __main__ import test", number=100000)
times[i] = t
print("%d additions takes %f" % (i, t))
keys = sorted(list(times.keys()))
for i in range(len(keys) - 2):
print("1 addition takes %f" % ((times[keys[i+1]] - times[keys[i]]) / (keys[i+1] - keys[i])))
Run Code Online (Sandbox Code Playgroud)
输出:
16 additions takes 0.288647
32 …Run Code Online (Sandbox Code Playgroud)