当前位置: 首页 > 面试题库 >

为什么在C#中我的计算比Python这么快

上官琦
2023-03-14
问题内容

下面是分别用C#和编码的简单过程Python(对于那些对此过程感到好奇的人,这是针对Euler项目5号问题的解决方案)。

我的问题是,C#下面的代码仅需9秒即可迭代,而Python代码完成则需要283秒(确切地说,在Python
3.4.3-64位上为283秒,在Python 2.7.9-32位上为329秒)。

到目前为止,我已经编码的两种类似的过程C#Python与执行时间的差异,具有可比性。但是,这次,经过的时间之间存在极大的差异。

我认为,这种差异的一部分来自python语言的灵活变量类型(我怀疑python将变量的一部分转换为double),但这仍然很难解释。

我究竟做错了什么?

我的系统:Windows-7 64位,

C#-VS Express 2012(9秒)

Python 3.4.3 64位(283秒)

Python 2.7.9 32位(329秒)

C清晰代码:

using System;

namespace bug_vcs {
    class Program {
        public static void Main(string[] args) {
            DateTime t0 = DateTime.Now;
            int maxNumber = 20;
            bool found = false;
            long start = maxNumber;
            while (!found) {
                found = true;
                int i = 2;
                while ((i < maxNumber + 1) && found) {
                    if (start % i != 0) {
                        found = false;
                    }
                    i++;
                }
                start++;
            }
            Console.WriteLine("{0:d}", start - 1);
            Console.WriteLine("time elapsed = {0:f} sec.", (DateTime.Now - t0).Seconds);
            Console.ReadLine();
        }
    }
}

和python代码:

from datetime import datetime

t0 = datetime.now()
max_number = 20
found = False
start = max_number
while not found:
    found = True
    i = 2
    while ((i < max_number + 1) and found):
        if (start % i) != 0:
            found = False
        i += 1
    start += 1

print("number {0:d}\n".format(start - 1))

print("time elapsed = {0:f} sec.\n".format((datetime.now() - t0).seconds))

问题答案:

答案很简单,就是Python处理所有对象,并且默认情况下没有JIT。因此,不是通过修改堆栈上的几个字节并优化代码的较热部分(即迭代)来提高效率,而是与大量表示数字的对象一起使用Python突突,而没有即时优化。

如果您在具有JIT的Python变体中尝试过此操作(例如PyPy),我保证您会看到很大的不同。

一个一般性的技巧是避免使用标准的Python进行非常昂贵的操作(尤其是如果这是为后端处理来自多个客户端的请求)。带有JIT的Java,C#,JavaScript等效率更高。

顺便说一句,如果您想以更Python的方式编写示例,则可以这样做:

from datetime import datetime
start_time = datetime.now()

max_number = 20
x = max_number
while True:
    i = 2
    while i <= max_number:
        if x % i: break
        i += 1
    else:
        # x was not divisible by 2...20
        break
    x += 1

print('number:       %d' % x)
print('time elapsed: %d seconds' % (datetime.now() - start_time).seconds)

上面对我执行了90秒。它之所以更快,是因为它看起来像愚蠢的东西,比如x比短start,这是因为我没有经常分配变量,而是依靠Python自己的控制结构,而不是依靠变量检查来跳入/跳出循环。



 类似资料:
  • 我在练习leetcode第5题。真正让我困惑的是这里C++(20ms)和Python(1000ms)之间巨大的运行时差异。 我知道Python是一种解释性语言,所以一般来说它比C++慢。但是在这里,C++比Python快50倍是我无法理解的。两个程序都使用相同的算法,所以并非如此。是因为C++和Python中字符串的实现方式吗? C++ Python

  • Java: 如果java以微弱优势击败了C和C#我不会感到惊讶,但速度快了20倍?! 文件的格式如下: 另外,我认为值得注意的是,java在NetBeans中运行时大约需要11秒(即使是在“运行”模式下,而不是在“调试”模式下)。 我也尝试编译为C++而不是C,但没有什么不同。 我对C和C#都使用VS2015。 Java: 好吧,我按照建议重新做了测试: 首先,我在C和C#中都使用了类/struc

  • 问题内容: 我可以在网上(在Stack Overflow上以及其他方面)找到大量有关使用Python或在Python中进行连接是一种非常低效且不好的做法的信息。 我似乎找不到为什么效率如此低下。在这里没有提到“在某些情况下已针对20%的改进进行了优化”(仍然不清楚这些情况是什么),我找不到任何其他信息。 在比其他Python串联方法更好的技术水平上发生了什么? 问题答案: 假设您有这段代码可以从三

  • 问题内容: 为了在工作中进行演示,我想比较NodeJS和C的性能。这是我写的: Node.js(for.js): 我使用GCC编译for.c并运行它: 结果: 然后我在NodeJS中尝试了它: 结果: 在运行了无数次之后,我发现无论如何它都是成立的。如果我将for.c切换double为long在循环中使用a而不是a ,则C花费的时间甚至更长! 不是试图发动火焰战争,但是为什么执行相同操作的Node

  • 问题内容: 据我了解,该函数实际上是Python 3中的一种对象类型,它像生成器一样动态生成其内容。 在这种情况下,我本以为下一行会花费过多的时间,因为要确定1个四舍五入是否在范围内,必须生成一个四舍五入值: 此外:似乎无论我添加多少个零,计算多少都花费相同的时间(基本上是瞬时的)。 我也尝试过这样的事情,但是计算仍然是即时的: 如果我尝试实现自己的范围函数,结果将不是很好! 使物体如此之快的物体