首页 > 解决方案 > 执行时间中的 Python 基准测试峰值

问题描述

我在一个更复杂的程序中遇到了一个非常烦人的问题,并构建了这个更简单的程序来弄清楚发生了什么。我是 python 新手,内存问题让我感到困惑(如果实际上这是一个内存问题)此代码仅执行并输出每个 While True 循环的执行时间:

# just iterates a bunch of times, timing how long it takes
def run_loops():

    curr_milliseconds_loop = time.time() * 1000

    for i in range(0,10000000):
        c = 1

    print("LOOP! MS=", time.time() * 1000 - curr_milliseconds_loop)


# starts my program
def start_program():

    while True:

        run_loops()
        gc.collect()

# start program in main
if __name__ == '__main__':

    start_program()

问题是执行时间出现了峰值。我会说这段代码,它可能平均每 20 次迭代发生一次,它通常是该循环的 3 倍长的执行时间。这是我的终端窗口的一些示例输出,从头开始

LOOP! MS= 239.360595703125
LOOP! MS= 236.3681640625
LOOP! MS= 238.360595703125
LOOP! MS= 242.3515625
LOOP! MS= 240.355224609375
LOOP! MS= 228.385009765625
LOOP! MS= 229.382568359375
LOOP! MS= 232.376220703125
LOOP! MS= 238.3603515625
LOOP! MS= 243.35205078125
LOOP! MS= 239.340576171875
LOOP! MS= 238.332763671875
LOOP! MS= 226.39404296875
LOOP! MS= 230.38330078125
LOOP! MS= 226.393798828125
LOOP! MS= 230.383544921875
LOOP! MS= 236.400634765625
LOOP! MS= 232.376953125
LOOP! MS= 230.386474609375
LOOP! MS= 234.37890625
LOOP! MS= 233.3740234375
LOOP! MS= 247.345458984375
LOOP! MS= 240.359130859375
LOOP! MS= 245.3427734375
LOOP! MS= 227.357666015625
LOOP! MS= 232.3779296875
LOOP! MS= 224.399169921875
LOOP! MS= 230.383056640625
LOOP! MS= 224.39892578125
LOOP! MS= 232.378173828125
LOOP! MS= 228.38818359375
LOOP! MS= 230.3828125
LOOP! MS= 227.426513671875
LOOP! MS= 245.34619140625
LOOP! MS= 246.343017578125
LOOP! MS= 229.384765625
LOOP! MS= 225.396240234375
LOOP! MS= 229.38623046875
LOOP! MS= 229.385986328125
LOOP! MS= 232.3779296875
LOOP! MS= 328.12158203125   <-- spike
LOOP! MS= 233.37548828125
LOOP! MS= 229.385986328125
LOOP! MS= 230.3828125
LOOP! MS= 228.388427734375
LOOP! MS= 231.381103515625
LOOP! MS= 234.37255859375
LOOP! MS= 231.380615234375
LOOP! MS= 227.39111328125
LOOP! MS= 247.338134765625
LOOP! MS= 229.3857421875
LOOP! MS= 237.393310546875
LOOP! MS= 377.954345703125
LOOP! MS= 233.37548828125
LOOP! MS= 230.383544921875
LOOP! MS= 232.3779296875
LOOP! MS= 232.378173828125
LOOP! MS= 245.376953125
LOOP! MS= 250.326904296875
LOOP! MS= 233.37939453125
LOOP! MS= 238.365234375
LOOP! MS= 232.378662109375
LOOP! MS= 228.399658203125
LOOP! MS= 235.3701171875
LOOP! MS= 228.388427734375
LOOP! MS= 374.997314453125
LOOP! MS= 483.706298828125   <-- spike
LOOP! MS= 354.0517578125
LOOP! MS= 228.387939453125
LOOP! MS= 233.375244140625
LOOP! MS= 228.38818359375
LOOP! MS= 233.37451171875
LOOP! MS= 259.30615234375
LOOP! MS= 236.366943359375
LOOP! MS= 229.385986328125
LOOP! MS= 233.37451171875
LOOP! MS= 230.383056640625
LOOP! MS= 234.37255859375
LOOP! MS= 229.3857421875
LOOP! MS= 232.3779296875
LOOP! MS= 238.3955078125
LOOP! MS= 236.36328125
LOOP! MS= 238.365478515625
LOOP! MS= 240.357421875
LOOP! MS= 235.370361328125
LOOP! MS= 251.3291015625
LOOP! MS= 249.32568359375
LOOP! MS= 252.331787109375
LOOP! MS= 232.3818359375
LOOP! MS= 245.340087890625
LOOP! MS= 251.330810546875
LOOP! MS= 224.39794921875
LOOP! MS= 232.37841796875
LOOP! MS= 227.3916015625
LOOP! MS= 244.38037109375
LOOP! MS= 253.295166015625
LOOP! MS= 253.323974609375
LOOP! MS= 245.339111328125
LOOP! MS= 241.35693359375
LOOP! MS= 242.35302734375
LOOP! MS= 245.340576171875
LOOP! MS= 239.32763671875
LOOP! MS= 249.33447265625
LOOP! MS= 248.304443359375
LOOP! MS= 233.37353515625
LOOP! MS= 231.379638671875
LOOP! MS= 239.39111328125
LOOP! MS= 248.334716796875
LOOP! MS= 241.398193359375
LOOP! MS= 242.35009765625
LOOP! MS= 251.359619140625
LOOP! MS= 257.312255859375
LOOP! MS= 263.262939453125
LOOP! MS= 229.38671875
LOOP! MS= 247.369873046875
LOOP! MS= 234.373046875
LOOP! MS= 243.349609375
LOOP! MS= 238.330078125
LOOP! MS= 250.325927734375
LOOP! MS= 262.271728515625
LOOP! MS= 236.37744140625
LOOP! MS= 242.346923828125
LOOP! MS= 241.330810546875
LOOP! MS= 351.059326171875
LOOP! MS= 240.329833984375
LOOP! MS= 248.3330078125
LOOP! MS= 253.322998046875
LOOP! MS= 242.347412109375
LOOP! MS= 230.383056640625
LOOP! MS= 239.36328125
LOOP! MS= 241.35302734375
LOOP! MS= 247.339111328125
LOOP! MS= 245.343505859375
LOOP! MS= 249.331787109375
LOOP! MS= 243.318115234375
LOOP! MS= 256.3134765625
LOOP! MS= 236.374267578125
LOOP! MS= 258.27734375
LOOP! MS= 259.30224609375
LOOP! MS= 250.362060546875
LOOP! MS= 245.3447265625
LOOP! MS= 245.341796875
LOOP! MS= 248.334228515625
LOOP! MS= 241.354248046875
LOOP! MS= 254.31982421875
LOOP! MS= 252.32861328125
LOOP! MS= 254.350830078125
LOOP! MS= 250.322021484375
LOOP! MS= 254.29248046875
LOOP! MS= 233.3779296875
LOOP! MS= 243.346923828125
LOOP! MS= 262.267578125
LOOP! MS= 323.16162109375
LOOP! MS= 244.34423828125
LOOP! MS= 254.32080078125
LOOP! MS= 356.048095703125
LOOP! MS= 238.363037109375
LOOP! MS= 241.359130859375
LOOP! MS= 254.280517578125
LOOP! MS= 225.3994140625
LOOP! MS= 480.714111328125   <-- spike
LOOP! MS= 236.3701171875
LOOP! MS= 233.37109375
LOOP! MS= 236.36962890625
LOOP! MS= 246.364990234375
LOOP! MS= 249.33154296875
LOOP! MS= 247.333251953125
LOOP! MS= 246.34228515625
LOOP! MS= 256.31689453125
LOOP! MS= 251.3271484375
LOOP! MS= 242.354248046875
LOOP! MS= 247.34716796875
LOOP! MS= 251.322509765625
LOOP! MS= 240.36279296875
LOOP! MS= 243.350341796875
LOOP! MS= 243.3505859375
LOOP! MS= 256.28759765625
LOOP! MS= 246.341552734375
LOOP! MS= 262.34228515625
LOOP! MS= 249.30029296875
LOOP! MS= 253.322021484375
LOOP! MS= 263.263916015625
LOOP! MS= 236.366943359375
LOOP! MS= 246.341796875
LOOP! MS= 245.37646484375
LOOP! MS= 248.330078125
LOOP! MS= 239.360595703125
LOOP! MS= 252.3271484375
LOOP! MS= 260.305419921875
LOOP! MS= 272.313232421875
LOOP! MS= 238.364501953125
LOOP! MS= 238.363525390625
LOOP! MS= 243.34912109375
LOOP! MS= 238.330322265625
LOOP! MS= 255.28564453125
LOOP! MS= 266.289794921875
LOOP! MS= 261.333251953125
LOOP! MS= 261.268798828125
LOOP! MS= 256.3056640625
LOOP! MS= 246.342529296875
LOOP! MS= 248.3037109375
LOOP! MS= 251.29541015625
LOOP! MS= 250.298095703125
LOOP! MS= 240.35693359375
LOOP! MS= 259.339111328125
LOOP! MS= 250.361572265625
LOOP! MS= 256.280029296875
LOOP! MS= 235.368896484375
LOOP! MS= 243.34912109375
LOOP! MS= 241.35498046875
LOOP! MS= 254.351806640625
LOOP! MS= 254.353759765625
LOOP! MS= 261.3017578125
LOOP! MS= 252.29248046875
LOOP! MS= 260.304931640625
LOOP! MS= 254.287841796875
LOOP! MS= 246.338134765625
LOOP! MS= 358.0498046875
LOOP! MS= 1162.85546875     <-- spike
LOOP! MS= 784.875244140625
LOOP! MS= 232.34619140625
LOOP! MS= 239.359619140625
LOOP! MS= 250.3349609375
LOOP! MS= 229.385498046875
LOOP! MS= 233.375244140625
LOOP! MS= 235.3984375
LOOP! MS= 240.3583984375
LOOP! MS= 237.362548828125
LOOP! MS= 240.322998046875
LOOP! MS= 230.385009765625
LOOP! MS= 232.40234375
LOOP! MS= 235.36328125
LOOP! MS= 242.346923828125
LOOP! MS= 410.875            <-- spike
LOOP! MS= 239.35986328125
LOOP! MS= 238.36279296875
LOOP! MS= 241.35498046875
LOOP! MS= 251.33154296875
LOOP! MS= 239.35986328125
LOOP! MS= 238.360595703125
LOOP! MS= 234.3408203125
LOOP! MS= 230.383056640625
LOOP! MS= 235.369873046875
LOOP! MS= 230.3828125
LOOP! MS= 232.4052734375
LOOP! MS= 242.3828125
LOOP! MS= 249.33447265625
LOOP! MS= 252.293212890625
LOOP! MS= 264.321044921875
LOOP! MS= 254.32177734375
LOOP! MS= 256.3125
LOOP! MS= 255.318603515625
LOOP! MS= 261.33251953125
LOOP! MS= 255.35009765625
LOOP! MS= 251.2958984375
LOOP! MS= 228.392333984375
LOOP! MS= 769.913818359375
LOOP! MS= 1191.76220703125
LOOP! MS= 364.056396484375
LOOP! MS= 236.3701171875
LOOP! MS= 243.349853515625
LOOP! MS= 243.31640625
LOOP! MS= 235.33837890625
LOOP! MS= 256.314453125
LOOP! MS= 244.31494140625
LOOP! MS= 237.328125
LOOP! MS= 244.373046875
LOOP! MS= 251.328369140625
LOOP! MS= 257.344970703125
LOOP! MS= 247.339111328125
LOOP! MS= 253.3125
LOOP! MS= 249.33349609375
LOOP! MS= 254.318603515625
LOOP! MS= 234.404296875
LOOP! MS= 247.339111328125
LOOP! MS= 231.376708984375
LOOP! MS= 239.355224609375
LOOP! MS= 238.330078125
LOOP! MS= 243.3828125
LOOP! MS= 247.33837890625
LOOP! MS= 245.342041015625
LOOP! MS= 239.3603515625
LOOP! MS= 252.293701171875
LOOP! MS= 228.387939453125
LOOP! MS= 234.372802734375
LOOP! MS= 229.385498046875
LOOP! MS= 240.39013671875
LOOP! MS= 242.347900390625
LOOP! MS= 246.333251953125
LOOP! MS= 243.34765625
LOOP! MS= 252.32568359375
LOOP! MS= 249.33642578125
LOOP! MS= 254.346923828125

这些尖峰非常烦人,它也发生在我更复杂的程序中,因为代码更多,它们更加重要。这里有什么问题?是我的电脑吗?是垃圾回收问题吗?我试过使用 gc.collect() 并且你可以看到仍然有尖峰,但我很确定没有 gc.collect() 尖峰会更频繁。我怎样才能完全摆脱这些尖峰?即使执行时间略有增加,也最好不要出现尖峰。感谢任何帮助。代码在解释器中运行,未编译。

PS我对python很陌生,所以请像我6岁一样向我解释。谢谢

标签: python

解决方案


推荐阅读