【发布时间】:2015-06-06 07:15:55
【问题描述】:
这里,del 运算符是定时的:
from timeit import Timer
def build_list(n):
return list(range(n)) # create list of 1 to n
def build_dict(n): # build dict = { 0:"0", 1:"1", 2:"2", ... n:"n" }
return {i: str(i) for i in range(n)} # from last listing in this chapter
def inx(x,n): # do in front, middle, end, and not found
str(0) in x
str(n//2) in x
str(n-1) in x
str("a") in x # not in it
timeList = Timer(
"inx(x,n)",
"from __main__ import n,build_list,inx; x = build_list(n)")
timeDict = Timer(
"inx(x,n)",
"from __main__ import n,build_dict,inx; x = build_dict(n)")
# get min of 5 runs of 5
print("N", "\t", "List", "\t", "Dict")
for size in range(1000, 100000+1, 5000): # sizes to graph for n:
n = size
list_secs = timeList.repeat(5,5)
dict_sect = timeDict.repeat(5,5)
print(n, "\t", min(list_secs), "\t", min(dict_sect))
这一次,是计算执行 in 运算符而不是 del 运算符所需的时间。哪些代码需要更改和添加?
【问题讨论】:
-
dict 的那些
in x计时有点误导,因为与执行 dict 查找相比,构建每个测试字符串所需的时间很重要。要看到这一点,请从inx(x,n)的每一行中删除in x。仅调用inx()函数和构造字符串的时间大约是进行完整测试的时间的 50%。 -
嗯,我可以看到,但这与 in 运算符的计时有关吗?
-
是和不是。 :) 上面的代码当然表明
in在字典上比在相同大小的列表上要快得多。但它报告的时间并不仅仅是只是为in操作计时——这些时间还包括调用inx()函数本身所花费的时间以及构建4 个字符串所花费的时间。而且这些东西所花费的时间与在字典上执行实际的in操作所花费的时间大致相同。因此,代码打印的数字不应被视为在列表上执行in与在字典上执行之间的相对速度差异的准确指示。 -
那么你建议我做什么来获得我想要的结果?
-
没有完美的解决方案,但一般原则是尽量减少您正在计时的代码内完成的任何额外工作,以便完成这些额外工作所花费的时间不会淹没您真正想要衡量的操作。因此,在设置代码中或在调用计时器方法之前,请尽可能多地进行工作。如果您怀疑与要测试的实际操作相比开销很大(例如在这种情况下),您可以创建一个函数来完成额外的工作并对其计时,以便您了解这些东西需要多少时间。
标签: python operator-keyword timing