Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么组合多个生成器显示同一进程的不同时间_Python_Generator - Fatal编程技术网

Python 为什么组合多个生成器显示同一进程的不同时间

Python 为什么组合多个生成器显示同一进程的不同时间,python,generator,Python,Generator,我有一个child函数,它将迭代1000000次。现在,当我在两个不同的函数上调用子函数时。这表明每次执行都需要不同的时间。为什么会这样 import timeit def child(): for i in range(1_000_000): yield i def slow(): yield from child() def fast(): yield from child() baseline = timeit.timeit( stm

我有一个
child
函数,它将迭代
1000000次。现在,当我在两个不同的函数上调用子函数时。这表明每次执行都需要不同的时间。为什么会这样

import timeit

def child():
    for i in range(1_000_000):
        yield i

def slow():
    yield from child()

def fast():
    yield from child()

baseline = timeit.timeit(
    stmt='for _ in slow(): pass',
    globals=globals(),
    number=50
)
comparision = timeit.timeit(
    stmt='for _ in fast(): pass',
    globals=globals(),
    number=50
)
print(f'Manual nesting {baseline:.2f}s')
print(f'Composed nesting {comparision:.2f}s')
输出

# First execution
Manual nesting 9.94s
Composed nesting 9.35s

# Second execution
Manual nesting 9.20s
Composed nesting 9.77s

正如您已经看到的,上面的输出。它显示了不同的时间间隔。为什么在同一个进程中会发生这种情况?

任何Python函数在每次运行时都会花费不同的时间,彼此接近,但略有不同。原因有很多:

  • 您的操作系统(Windows、Linux等)有许多进程和线程。每个进程和线程计划只运行少量连续时间,通常为几毫秒,然后进程/线程切换到另一个。这意味着您的执行过程可能会在中间暂停,然后在操作系统重新安排它之后的某个时间继续。所以运行程序不是一个连续的过程
  • 每个现代CPU每次执行每条指令的时间也不同。有不同的预测算法和缓存算法以及无序执行和前瞻缓冲区等。所有这些都会导致每个小指令的执行时间略有不同
  • CPU内核可能会改变其运行速度、频率。有时它们会减速(过热时)或短时增压(涡轮频率)。这意味着每次运行时,CPU核心速度可能会在随机时间点发生变化
  • 此外,每次函数运行完成后,Python的执行环境也略有不同。例如,内存管理器可能有一个不同的可用内存块列表(另一个长度、其他大小的块等),因此分配每个Python对象将为执行内存分配的每个Python指令花费不同的时间,Python做了很多工作
  • 此外,Python可能会在后台运行额外的服务线程,它们也会占用主进程的不同执行时间。因为,它会在任何单个Python线程运行时阻止所有其他线程
  • 此外,如果您的函数在输入上不是确定性的(并且您的函数是确定性的),那么它可能在每次运行时运行不同的时间量,因为它基本上执行不同的操作码序列
  • 所有这些以及更多的原因使得整个Python执行系统在时间上不可预测,这意味着每次运行函数都会有轻微的(有时甚至是巨大的)时间差异


    即使不仅仅是Python,而且对于任何在计算机上运行的程序,这些原因中的大多数都是适用的,并且任何程序在每次执行时的速度都会有所不同。我想可能存在一些特殊的编程语言,可以将每个指令/操作码的执行与某些高分辨率时钟同步,例如在火星着陆航天器上,每个函数的执行可能需要精确到纳秒。那么,对于用这种语言编写的程序,计时几乎是精确的。但对于Python,它在运行操作码时不会执行任何时间同步。

    这是否回答了您的问题?我不明白这个问题。你是否希望它总是需要完全相同的时间,高达一阿秒?也许你想了解一下二项式分布或正态分布。@MateenUlhaq是的,我希望所花的时间几乎相同。@Shiva不,那不是问题所在answer@toRex任何Python函数在不同的运行中都会花费不同的时间,虽然彼此很接近,但还是有点不同。一个明显的原因是您的操作系统(Windows、Linux…)运行着许多进程。它们都在不同的时间点随时切换线程。因此,您的Python执行线程不是连续的,它可以在中间停止,并且在操作系统再次调度时稍稍继续。