为什么偶尔解析一个词典需要比平常更长的时间

时间:2017-02-07 19:40:36

标签: python python-3.x dictionary optimization

虽然在一个相当大的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

定时

1 个答案:

答案 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.timedatetime.now的结果要小得多(同样,看看标准偏差):

Mean: 11.520527719010078
Stddev: 4.476865528640042
Max: 443.1869339160954