0

与其他语言相比,有很多关于 python 性能的一般性问题。我有更具体的例子:在 python 和 c# 中编写了两个简单的函数,都检查 int 数是否为素数。

Python:

import time

def is_prime(n):
    num =n/2
    while num >1:
        if n % num ==0:
            return 0
        num-=1
    return 1

start = time.clock()
probably_prime = is_prime(2147483629)
elapsed = (time.clock() - start)
print 'time : '+str(elapsed)

和 C#:

 using System.Diagnostics;

 public static bool IsPrime(int n)
        {
            int num = n/2;
            while(num >1)
            {
                if(n%num ==0)
                {
                    return false;
                }
                num-=1;
            }
            return true;
        }
 Stopwatch sw = new Stopwatch();
 sw.Start();
 bool result = Functions.IsPrime(2147483629);
 sw.Stop();
 Console.WriteLine("time: {0}", sw.Elapsed);

和时间(这对我作为 python 初学者来说是个惊喜:)):

蟒蛇:121s;时间:6s

你能解释一下这个巨大的差异来自哪里吗?

4

1 回答 1

0

如果没有类型信息,Python 会花费更多的时间来查找要做什么,而不是在那个大的 while 循环中执行它。

您可以通过以下几种方式使用 Python 语法更快地运行它:

1) 使用 PyPy --- 它观察代码是如何运行的,注意类型,并用运行中的快速机器代码替换慢查找 --- 这很酷

2) 使用 Numba --- 这适用于标准 CPython 运行时,因此可以与您最喜欢的 Python 扩展一起使用。通过添加装饰器,您可以在使用“类型化”事物(如整数)调用该函数时将其预编译为机器代码。

我无法进行 PyPy 计时,但在我的系统上 Python 代码大约需要 180 秒,而 numba 代码大约需要 14 秒。

这是numba代码:

import numba
@numba.jit(numba.bool_(numba.int64), nopython=True)
def is_prime(n):
    num =n/2
    while num >1:
       if n % num ==0:
            return 0
        num-=1
    return 1
于 2013-06-25T22:19:50.980 回答