【问题标题】:Is it computationally more intensive to assign value to a variable or repeat a simple operation?为变量赋值还是重复一个简单的操作在计算上是否更密集?
【发布时间】:2017-12-03 23:13:48
【问题描述】:

现在我可能在这里吹毛求疵,但我想知道仅就运行整个程序所需的时间而言,在大量迭代(假设对内存没有限制)中哪个计算效率更高。
我主要问的是python和c这两种语言,因为这是我最常用的两种语言。
例如在 c 中,类似于:

int count, sum = 0, 0;
while (count < 99999){
    if (((pow(count, 2))/10)%10 == 4) {// just some random operation
        sum += pow(count, 2);
        }
    count++;
    }

或

int count, sum, temp = 0, 0, 0;
while (count < 99999){
    temp = pow(count, 2)
    if (((temp/10)%10 == 4) {// just some random operation
        sum += temp;
        }
    count++;
    }

在python中类似

for i in range (99999):
    n = len(str(i))
    print "length of string", str(i), "is", n

或

for i in range (99999):
    temp = str(i)
    n = len(temp)
    print "length of string:, temp, "is", n

现在这些只是我在运行中想到的随机操作,我的主要问题是创建一个新变量还是重复操作更好。我知道所需的计算能力会随着i、count 的增加而改变,但只是针对大量迭代进行推广,这样会更好。

【问题讨论】:

  • 这取决于:很多。通常,答案是再次执行操作更昂贵,但对于某些事情(例如 C 中用于字节交换或其他任务的按位操作),操作可能更便宜。通常,如果您担心性能并执行一次操作,我会创建新变量。如果您真的需要知道,唯一的长期答案是分析您的代码。
  • 幸运的是 Python 有一个 timeit 模块可以准确地回答这个问题。
  • 假设 C 编译器不知道 pow() 没有副作用,它将无法优化第二次调用。从编译器的角度来看,这两段代码具有不同的行为。想象一下 pow() 本身称为 printf();第一个示例偶尔会打印两行,第二个示例不会。我们知道 pow() 没有副作用,所以我们必须进行相应的编程。

标签: python c memory-management computation


【解决方案1】:

我已经用timeit在python中测试了你的两个代码,结果是1.0221271729969885秒为第一个选项,1.0154028950055363为第二个选项

我只对每个示例进行了一次迭代,并且如您所见,它们彼此非常接近,仅在一次迭代后太接近以至于无法可靠。如果您想了解更多信息,我建议您使用timeit 自己进行这些测试

但是,您在此处执行的操作是用 2 调用 str(i) 替换对 temp 的变量赋值,而不是一个,当然,对于其他函数,它可能会有很大差异比str 或多或少复杂和耗时

【讨论】:

    【解决方案2】:

    缓存在大多数情况下确实可以提高代码的性能和可读性。一些超快速操作可能存在极端情况,但我想说第二个示例中使用的代码类型总是更好。

    缓存值很可能会存储在寄存器中,因此将涉及一个 mov。根据this document 的说法,没有那么多便宜的操作。

    至于可读性,请考虑具有更多参数的更大的函数调用,在审查代码时,需要更多的脑力劳动来检查调用是否相同,此外,如果函数更改可能会引入错误,即一个调用已被修改,而另一个调用已被修改被遗忘(主要适用于 Python)。

    总而言之,在这种情况下,驱动您选择的应该是可读性,而不是性能提升。除非分析器指向这段代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2011-10-18
      相关资源
      最近更新 更多