如何在Python中精准测量牛顿迭代法的微小耗时?
如何在Python中精准测量牛顿迭代法的微小耗时?
刚接触编程就折腾数值计算的性能分析,已经超棒啦!你的问题其实很典型:单次牛顿迭代循环的耗时实在太短——现代CPU执行这么几行代码可能只需要几纳秒,而普通计时方法的精度跟不上,所以测出来全是0。咱们可以从两个方向解决这个问题:
核心思路:放大测量窗口
单次执行的时间太短捕捉不到?那咱们就把同一个计算重复成千上万次,用总耗时除以次数,得到更准确的单次平均耗时。这是性能测试里常用的技巧,能有效抵消系统时钟精度的限制。
具体修改方案
结合Python推荐的高精度计时函数time.perf_counter()(它的精度比time.time()、process_time()更高,专门用于短时间测量),再加上多次重复测试,就能得到靠谱的结果了。
这里是修改后的代码示例,你可以直接套用:
import math import time # 定义函数 def f(x): return x**2 - 4 # 定义导数 def fderiv(x): return 2*x # 牛顿迭代公式 def Newton(x): return (x - f(x)/fderiv(x)) # 目标零点 zero = 2 # 重复测试次数(可根据实际情况调整,比如10000/100000) num_runs = 10000 # 遍历不同起始点 for n in range(-100, 100): start = zero + n/100 current = start difference = abs(current - zero) # 先验证当前起始点是否能正常收敛(避免重复测试时报错) try: temp_current = start temp_diff = abs(temp_current - zero) while temp_diff > 0.00001: temp_current = Newton(temp_current) temp_diff = abs(temp_current - zero) # 开始多次重复计时 start_time = time.perf_counter() for _ in range(num_runs): current = start diff = abs(current - zero) while diff > 0.00001: current = Newton(current) diff = abs(current - zero) total_time = time.perf_counter() - start_time # 计算单次平均耗时 avg_time = total_time / num_runs print(f"{start}: 平均耗时: %.12f" % avg_time) except: print(f"{start}: Error")
为什么之前的方法没效果?
- 单次耗时太短:哪怕用
time.time_ns(),单次牛顿循环的时间可能比系统时钟的最小间隔还小,所以测出来的差值是0。多次重复后,总耗时足够长,就能被准确捕捉了。 - 选对计时函数:
time.perf_counter()是Python官方推荐的性能测量工具,它会自动忽略系统休眠时间,专注于程序实际运行的CPU时间,精度比time.time()高得多。
额外小建议
- 可以灵活调整
num_runs的数值:如果平均耗时还是太小,就把次数调大(比如100000);如果总耗时太长,就适当调小。 - 你的起始点范围是1到3,不会碰到导数为0的情况,但
try-except保留下来仍然很有必要,能应对迭代过程中可能出现的意外错误。
备注:内容来源于stack exchange,提问作者3005736
相关产品推荐
相关产品推荐

