虽然在一个相当大的Python(3)项目上工作,我遇到了这种奇怪的行为,偶尔迭代字典(<0.1%的时间)比正常时间长几千倍。
这是一个显示行为的非常小的示例:
from time import perf_counter
from statistics import mean
d = {"1": 0}
times = []
for _ in range(1000000):
start = perf_counter()
d = {k: v for k, v in d.items()}
diff = (perf_counter() - start) * 10e6
if diff > 0:
times.append(diff)
print("Mean: {}".format(mean(times)))
print("Max: {}".format(max(times)))
EG。运行一次给我的平均时间为10.806199298240244微秒,但最大时间为31015.980057418346微秒,比正常时间长约3000倍。
有没有办法可以避免这种行为,还是Python固有的?
编辑:使用perf_counter()代替datetime
定时答案 0 :(得分:3)
您提交的大多数字典创建操作只需几纳秒 - 并且已被视为0
微秒。结果,即使延迟时间为几微秒,每一个有一些延迟的动作都算是一个巨大的变化 - 每个0
结果都会降低平均值。{/ p>
此外,最大结果高度与其他结果不同(它们通常是由于CPU的原因) - 使用偏差可以清楚地显示差异,并标记正常结果的一般范围。 / p>
尝试
from time import perf_counter
from statistics import mean, stdev
d = {"1": 0}
times = []
for _ in range(100000):
start = perf_counter()
d = {k: v for k, v in d.items()}
diff = (perf_counter() - start) * 10e6
if diff > 0:
times.append(diff)
print("Mean: {}".format(mean(times)))
print("Stddev: {}".format(stdev(times)))
print("Max: {}".format(max(times)))
你应该得到更少的极端差异 - 并且比使用time.time
或datetime.now
的结果要小得多(同样,看看标准偏差):
Mean: 11.520527719010078
Stddev: 4.476865528640042
Max: 443.1869339160954