【发布时间】:2016-03-31 15:59:21
【问题描述】:
我想测量在 Python 3 中进行加法运算所需的时钟周期数。
我写了一个程序来计算加法运算的平均值:
from timeit import timeit
def test(n):
for i in range(n):
1 + 1
if __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.288647
32 additions takes 0.422229
64 additions takes 0.712617
128 additions takes 1.275438
256 additions takes 2.415222
512 additions takes 5.050155
1024 additions takes 10.381530
2048 additions takes 21.185604
4096 additions takes 43.122559
8192 additions takes 88.323853
16384 additions takes 194.353927
1 addition takes 0.008292
1 addition takes 0.010068
1 addition takes 0.008654
1 addition takes 0.010318
1 addition takes 0.008349
1 addition takes 0.009075
1 addition takes 0.008794
1 addition takes 0.008905
1 addition takes 0.010293
1 addition takes 0.010413
1 addition takes 0.010551
1 addition takes 0.010711
1 addition takes 0.011035
所以根据这个输出,一个加法大约需要 0.0095 微秒。按照this page 指令,我计算出一个加法需要25 个CPU 周期。这是一个正常值吗?为什么?因为汇编指令 ADD 只需要 1-2 个 CPU 周期。
【问题讨论】:
-
另外,添加甚至没有发生,因为它已经被优化了。
-
好的。但如果我运行超过 1000 次添加,我猜它不会影响
-
test中的 for 循环肯定会影响时间,无论迭代次数如何。 -
您用于计算循环一次迭代(“1 次加法”)时间的代码是错误的。应该是
times[keys[i]] / keys[i]。您计算多少个周期对应于 0.0095 秒也是错误的。以 2 GHz 运行的 CPU 在 0.0095 秒内执行 19,000,000 个周期。 Python 很慢,非常慢。它的操作比等效的汇编指令要长几个数量级。 -
@ross,哦,这只是一个错字。我的意思是 usec 而不是 sec.
((times[keys[i+1]] - times[keys[i]]) / (keys[i+1] - keys[i]))这段代码没有错。通过除以增量,我可以调整计算的准确性。
标签: python assembly clock timeit