【问题标题】:Can we say that Mathematically the time complexity of the code in python is better than that of C?我们能说在数学上python中代码的时间复杂度比C好吗?
【发布时间】:2014-06-09 08:14:46
【问题描述】:

打印菱形图案的python代码是:

def main():
n= input('The size of the diamond :: ')    
a=n
for i in range(n):
        print ' '*a,'*'*(2*i-1)
        a=a-1

a=0
p=n
for i in range(n):
        print ' '*a,'*'*(2*p-1)
        a=a+1
        p=p-1

main()

对于类似的输出,C 中的代码是 ::

#include<stdio.h>
int main()
{
   int i,j;
   int n;
   printf("---PATTERN---\n");
   printf("enter the number of rows :: \n");
   scanf("%d",&n);
   for(i=0;i<=n;i++)
   {
       for(j=n;j>i;j--)
        {
           printf(" ");
        }
       for(j=0;j<2*i+1;j++)
       {
          printf("*");
       }
       printf("\n");
   }
    i=0;
   for(i=0;i<=n;i++)
   {

       for(j=0;j<i;j++)
       {
          printf(" ");
       }
       for(j=2*n-1;j>=2*i-1;j--)
       {
          printf("*");
       }
    printf("\n");
 }

return 0;
}

我的问题是:我们可以说在数学上,python 中代码的时间复杂度比 C 中的要好吗? 尽管 C 程序的运行时间比 Python 少,但是 Python 中的相同程序不涉及循环嵌套,就像 C 的情况一样,我们可以说 Python 在结构上是一种更有效的语言吗? - 如果怀疑听起来很愚蠢,我深表歉意。

【问题讨论】:

  • 您能否让您的python代码在语法上有效?但是不,没有什么魔法可以让 python 更“高效”。
  • print ' '*a,'*'*(2*i-1) 这是你的嵌套循环。请记住,即使您将复杂性隐藏在简单的语句后面,它也不会消失。在 Python 中,您可以使用单个语句解析 XML 文件/应用正则表达式/向月球发射火箭,但这不会使其成为 O(1)。
  • 在KerrekScript 2.0中,你可以说print '*'&lt;&gt;n,所以复杂度是O(1)。 (事实证明,内置的菱形运算符真的将语言从默默无闻中推向了主流。)
  • @KerrekSB:实际上,我看到了 HQ9+ 的潜在扩展。
  • @juanchopanza 对不起先生 jst 从 IDLE 复制了代码,所以缩进丢失了

标签: python c time-complexity


【解决方案1】:

我们能说在数学上python代码的时间复杂度比C好吗?

不,你不能。与机器相关的代码的时间复杂度(甚至是理论上的)取决于机器最终会做什么(解决问题所花费的时间),而不是你如何判断要做什么,即 C 和 Python 是众多方法中的两种告诉它该做什么。但是,我建议您编译 Python code to C,然后对照您的 C 程序检查它,通过它您将比较苹果和苹果而不是橘子。更好的是,将它们都编译(并链接)成二进制文件并反汇编它们以验证您的假设,以查看两者实际上都在循环。

Python 不涉及循环嵌套

这只是 Python 作为一种语言提供的语法糖;但是,在引擎盖下,它也会循环,就像其他答案提到的那样。

我们可以说 Python 在结构上是一种更高效的语言吗?

再次不,因为结构是风格问题,而不是效率问题。

如果您关注的是性能(时间)或内存效率,那么这不是语言本身的固有特性,而是语言的实现以及它在给定架构上的执行情况;这再次应该被测量而不是假设/猜测。以 Lua 为例,同一种语言有不同的解释器(实现),其中有一个few are remarkably faster than the others。所以效率是实现的问题,而不是语言本身。

【讨论】:

    【解决方案2】:

    Python 上的嵌套循环并不那么容易看到。语句print ' '*a,'*'*(2*i-1) 也是一个循环(实际上每个“乘法”一个循环)——否则你怎么能做可变数量的重复工作?这不是你拼出来的循环。

    【讨论】:

    • 通过将问题中给出的python代码反汇编为字节码(使用dis)分析问题中给出的python代码,' 'a(内部print ' '*a,'*'*(2*i-1))之间涉及的操作为@987654325 @。我并不是说不涉及嵌套循环,只是想问一下,如果这个BINARY_MULTIPLY 是另一个抽象层并且在引擎盖下是否涉及循环?
    • @Vipul:你确定你没有看2*i 部分吗?
    • 是的!我绝对确定.. 实际上有 3 个 BINARY_MULTIPLY' '*a 第 1 个 '*'*(2*i-1) 第 2 个和 2*i 部分第 3 个。这里实际发生了什么?我不能在这里发布反汇编代码
    【解决方案3】:

    好吧,当你在 python 中执行 ' '*a 时,你实际上是在做一个隐藏的 for 循环

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多