当前位置: 首页 > 知识库问答 >
问题:

为什么用相同的输入运行相同的函数两次会在python上浪费不同的时间?

上官鸿朗
2023-03-14

下面的python代码尝试运行同一函数两次并输出运行时:

def test_f(f1,ip):
    st = time.time()
    f1(*ip)
    print(time.time()-st)

test_f(math.sin,[100])
test_f(math.sin,[100])

三次测试的输出如下:

7.15255737305e-06
1.19209289551e-06

7.86781311035e-06
9.53674316406e-07

6.91413879395e-06
9.53674316406e-07

我不知道为什么输出如此不同?为什么第二次执行比第一次快?我也尝试运行五次,结果如下:

8.10623168945e-06
1.19209289551e-06
0.0
0.0
0.0

共有1个答案

穆景辉
2023-03-14

在CPython中,编译模块时,会创建一个代码对象(其中包含字节码),但实际的函数调用需要一个框架对象(其中涉及一些运行时分配和初始化)。作为一种优化,这些帧对象有时会作为“僵尸”保持活动状态,以便以后重用。以下是frameobject源代码中广泛注释的一部分。c:

/*堆栈帧的分配和释放速度相当快。为了提高函数调用的速度,我们:

1. Hold a single "zombie" frame on each code object. This retains 
the allocated and initialised frame object from an invocation of 
the code object. The zombie is reanimated the next time we need a 
frame object for that code object. Doing this saves the malloc/ 
realloc required when using a free_list frame that isn't the 
correct size. It also saves some field initialisation.

如果您所观察到的不是time.time在该分辨率下的不可靠性的简单工件,则是创建僵尸(较慢)和重新激活僵尸(较快)之间的时间差。

 类似资料:
  • 我有两个不同的方法,在两个不同的类中。我希望他们都能阅读同一行输入,并检查不同的内容。一个查找“给我冲杯咖啡”之类的说明,另一个查找不同的关键字,如“请”和“谢谢”(这些影响程序对我的反应): 然后我在我的主字符串中调用它们,只是为了测试它们: 我的控制台显示如下: 我知道发生了什么,但我想不出其他办法。我也尝试过使用同一个扫描仪,不同的字符串,但仍然不起作用。我怎样才能使这两种方法都能读取我的第

  • 我需要从30fps的视频中提取帧两次:(I)720p png帧,(ii)270p tiff帧。 我分别使用以下命令来实现这一点: 然而,这导致第一命令输出35,776帧,第二命令输出35,812帧,尽管视频是相同的,并且所请求的framerate是30fps。 这是什么原因造成的?如何确保ffmpeg输出相同数量的(同步)帧?

  • 问题内容: 我正在使用具有Spring安全性的BCryptPasswordEncoder。我的期望是,对于相同的输入,我将始终获得相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用以下代码段对其进行测试: 输出:$ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi 输出2:$ 2a $ 10 $ KEvYX9y

  • 其中一个测试通过,另一个给出以下错误: java.lang.ClassCastException:类org.springframework.http.ResponseEntity不能强制转换为类org.junit.jupiter.api.function.executable(org.springframework.http.ResponseEntity和org.junit.jupiter.api

  • 我有一个棘手的问题要解决。我使用系统。方法调用之前和之后的currentTimeMillis(),因为我必须测量这两条语句之间经过的时间。 我担心的是每次运行程序都会得到不同的结果。 我明白了(这很完美): 几秒钟后,我再次运行程序,我得到(这是错误的): 我说这个输出是错误的,因为每辆车的等待时间不应该少于100毫秒。 什么实际影响基于currentTimeMillis函数的时间计算? 为什么我

  • 我正在使用带有Spring Security的BCryptPasswordEncoder。我的期望是,对于相同的输入,我总是得到相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用下面的代码片段对其进行测试: 输出:$2A$10$CYLM.QOXPEAZCZHJ3OXRLU9SLKB61LHYWW5QJ4QKVHEMHAXZ5QCPI 输出2:$2A$10$kevyx9yjj0f1x3wl