python – 一次添加需要多少CPU周期?

python – 一次添加需要多少CPU周期?,第1张

概述我想测量在 Python 3中进行加法运算所需的时钟周期数. 我写了一个程序来计算加法运算的平均值: from timeit import timeitdef test(n): for i in range(n): 1 + 1if __name__ == '__main__': times = {} for i in [2 ** n for n in 我想测量在 Python 3中进行加法运算所需的时钟周期数.

我写了一个程序来计算加法运算的平均值:

from timeit import timeitdef test(n):    for i in range(n):      1 + 1if __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])))

输出:

16 additions takes 0.28864732 additions takes 0.42222964 additions takes 0.712617128 additions takes 1.275438256 additions takes 2.415222512 additions takes 5.0501551024 additions takes 10.3815302048 additions takes 21.1856044096 additions takes 43.1225598192 additions takes 88.32385316384 additions takes 194.3539271  addition takes 0.0082921 addition takes 0.0100681 addition takes 0.0086541 addition takes 0.0103181 addition takes 0.0083491 addition takes 0.0090751 addition takes 0.0087941 addition takes 0.0089051 addition takes 0.0102931 addition takes 0.0104131 addition takes 0.0105511 addition takes 0.0107111 addition takes 0.011035

因此,根据此输出,一次添加大约需要0.0095个usecs.按照this page条指令,我计算出一次加法需要25个cpu周期.这是正常值,为什么?因为汇编指令ADD只需要1-2个cpu周期.

解决方法 您正在计时函数调用(test()),for循环和对range()的调用.增加的时间根本没有.

def test(n):    for i in range(n):        1 + 1import disdis.dis(test)

这是测试函数的字节代码(不包括对test()的调用):

2           0 SETUP_LOOP              24 (to 27)              3 LOAD_GLOBAL              0 (range)              6 LOAD_FAST                0 (n)              9 CALL_FUNCTION            1             12 GET_ITER                    >>   13 FOR_ITER                10 (to 26)             16 STORE_FAST               1 (i)  3          19 LOAD_CONST               2 (2)   ****              22 POP_top                          23 JUMP_absolute           13        >>   26 POP_BLOCK                   >>   27 LOAD_CONST               0 (None)             30 RETURN_VALUE

****注意,添加是在编译时完成的.相当多的其他语言及其编译器将会这样做,包括C.但是,标准很少定义何时实际执行11,因此它通常依赖于实现.

编辑:

你的timeit函数调用可能是这样的:

t = timeit("x += 1",setup="x = 1",number=100000)

我们可以创建一个虚函数来检查 *** 作:

def myfunc(x):    x += 1import disdis.dis(myfunc)

做出改变会给出:

1 additions takes 0.0089762 additions takes 0.0074194 additions takes 0.0072828 additions takes 0.00769316 additions takes 0.00702632 additions takes 0.00779364 additions takes 0.010168128 additions takes 0.008124256 additions takes 0.009064512 additions takes 0.0072561 addition takes -0.0015571 addition takes -0.0000681 addition takes 0.0001031 addition takes -0.0000831 addition takes 0.0000481 addition takes 0.0000741 addition takes -0.0000321 addition takes 0.000007 26           0 LOAD_FAST                0 (x)              3 LOAD_CONST               1 (1)              6 INPLACE_ADD              7 STORE_FAST               0 (x)             10 LOAD_CONST               0 (None)             13 RETURN_VALUE

注意,x = 1是INPLACE_ADD,与x = x 1不同,它是BINARY_ADD.因此,您需要确定要测量的OPCode.

总结

以上是内存溢出为你收集整理的python – 一次添加需要多少CPU周期?全部内容,希望文章能够帮你解决python – 一次添加需要多少CPU周期?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1194257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存