Python 时间比较:为什么一个带有三个赋值语句的单for循环比三个带有一个赋值语句的顺序for循环快两倍?

Python 时间比较:为什么一个带有三个赋值语句的单for循环比三个带有一个赋值语句的顺序for循环快两倍?,python,time,big-o,complexity-theory,Python,Time,Big O,Complexity Theory,为什么try1的速度是try2的两倍?这些函数不是都是O(n)吗?执行时间的差异是否完全是由于开销造成的 我是编程新手,正在通过Python自学算法和数据结构 根据我下面的文本,第一个函数的时间复杂度应该是3n(三个表示三个赋值语句),第二个函数的时间复杂度应该是n+n+n,或者3n 我错过了什么 def try1(n): start = time.time() for i in range(n): a = 1 b = 2 c =

为什么try1的速度是try2的两倍?这些函数不是都是O(n)吗?执行时间的差异是否完全是由于开销造成的

我是编程新手,正在通过Python自学算法和数据结构

根据我下面的文本,第一个函数的时间复杂度应该是3n(三个表示三个赋值语句),第二个函数的时间复杂度应该是n+n+n,或者3n

我错过了什么

def try1(n):
    start = time.time()
    for i in range(n):
        a = 1
        b = 2
        c = 3

    end = time.time()
    return c,end-start

def try2(n):
    start = time.time()
    for i in range(n):
        a = 1
    for i in range(n):
        b = 2
    for i in range(n):
        c = 3

    end = time.time()
    return c,end-start
(1) 如果range(n)实际上是在计算一个整数列表,那么您要做三次,而不是一次。 (2) 在第一个循环中,循环变量在n个事物的列表中循环一次,而在第二个循环中,循环变量在n个事物的列表中循环三次

我想第二个永远不会比第一个快,在没有优化编译器的情况下,我希望第二个会比第一个慢

你可以考虑尝试这个实验:

start = time.time()
for i in range(1000000):
    for j in range(n):
        break
end = time.time()
return c,end-start
用这段时间除以一百万,你应该对通话范围(n)的原始成本有一个很好的了解。如果这是你所看到的额外时间中最大的一部分,我也不会感到惊讶(与在列表中重复两次相比)

如果是这样的话,您还可以改进第二个示例,首先计算x=range(n),然后在x中使用i三次。

(1)如果range(n)实际上是在计算整数列表,那么您要做三次,而不是一次。 (2) 在第一个循环中,循环变量在n个事物的列表中循环一次,而在第二个循环中,循环变量在n个事物的列表中循环三次

我想第二个永远不会比第一个快,在没有优化编译器的情况下,我希望第二个会比第一个慢

你可以考虑尝试这个实验:

start = time.time()
for i in range(1000000):
    for j in range(n):
        break
end = time.time()
return c,end-start
用这段时间除以一百万,你应该对通话范围(n)的原始成本有一个很好的了解。如果这是你所看到的额外时间中最大的一部分,我也不会感到惊讶(与在列表中重复两次相比)


如果是这种情况,您还可以改进第二个示例,首先计算x=range(n),然后在x中使用i三次。

两种方法的时间复杂度都是O(n),但因子不同。Python代码不是使用一个优化编译器编译的,运行一个循环确实会带来一些开销。但是循环还包括
i
的变量赋值。在第一个例子中发生了n次,在第二个例子中是3*n次,没有O(3n)这样的东西,它只是O(n)。它告诉你一个给定的算法的主导项是什么,所以你可以粗略地考虑,在这里,对于n的大值,时间将与n成正比,如果n加倍,则时间加倍。它没有说别的,也没有告诉任何关于有效速度的事情。对于一些较小的n值,O(n^3)算法可能比O(log(n))算法快,我们只知道前者在n增长的某个点会变得慢得多。这两种方法的时间复杂度都是O(n),但有不同的因素。Python代码不是使用一个优化编译器编译的,运行一个循环确实会带来一些开销。但是循环还包括
i
的变量赋值。在第一个例子中发生了n次,在第二个例子中是3*n次,没有O(3n)这样的东西,它只是O(n)。它告诉你一个给定的算法的主导项是什么,所以你可以粗略地考虑,在这里,对于n的大值,时间将与n成正比,如果n加倍,则时间加倍。它没有说别的,也没有告诉任何关于有效速度的事情。对于一些较小的n值,O(n^3)算法可能比O(log(n))算法快,我们只知道,当n增长时,前者在某个点会变得慢得多。