千家信息网

Python比C++快吗

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇内容介绍了"Python比C++快吗"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!众所周知,Py
千家信息网最后更新 2025年11月15日Python比C++快吗

本篇内容介绍了"Python比C++快吗"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

众所周知,Python 是动态语言,有全局解释器锁,比其他静态语言要慢,也正是这个原因,你也许会转向其他语言如 Java、C++,不过先等等,今天分享一个可以让 Python 比 C++ 还要快的技术,看完再决定要不要转吧。
今天的主角就是 Numba,Numba 是一个开源的即时编译器(JIT compiler),可将 Python 和 NumPy 的代码的转换为快速的机器码,从而提升运行速度。可以达到 C 或 FORTRAN 的速度。 这么牛逼是不是很难用呢?No,No,No,So easy,你不需要替换 Python 解释器,不需要单独编译,甚至不需要安装 C / C ++ 编译器。只需将 Numba 提供的装饰器放在 Python 函数上面就行,剩下的就交给 Numba 完成。举个简单的例子:

from numba import jitimport random@jit(nopython=True)def monte_carlo_pi(nsamples):    acc = 0    for i in range(nsamples):        x = random.random()        y = random.random()        if (x ** 2 + y ** 2) < 1.0:            acc += 1    return 4.0 * acc / nsamples

Numba 是专为科学计算而设计的,在与 NumPy 一起使用时,Numba 会为不同的数组数据类型生成专门的代码,以优化性能:

@numba.jit(nopython=True, parallel=True)def logistic_regression(Y, X, w, iterations):    for i in range(iterations):        w -= np.dot(((1.0 /              (1.0 + np.exp(-Y * np.dot(X, w)))              - 1.0) * Y), X)    return w

现在我们来看看,同样的代码,使用 Numba 前后与 C++ 的性能对比。比如说我们要找出 1000 万以内所有的素数,代码的算法逻辑是相同的: Python 代码:

import mathimport timedef is_prime(num):    if num == 2:        return True    if num <= 1 or not num % 2:        return False    for div in range(3, int(math.sqrt(num) + 1), 2):        if not num % div:            return False    return Truedef run_program(N):    total = 0    for i in range(N):        if is_prime(i):            total += 1    return totalif __name__ == "__main__":    N = 10000000    start = time.time()    total = run_program(N)    end = time.time()    print(f"total prime num is {total}")    print(f"cost {end - start}s")

执行耗时:

total prime num is 664579cost 47.386465072631836s

C++ 代码如下:

#include #include #include using namespace std;bool isPrime(int num) {    if (num == 2) return true;    if (num <= 1 || num % 2 == 0) return false;    double sqrt_num = sqrt(double(num));    for (int div = 3; div <= sqrt_num; div +=2){       if (num % div == 0) return false;    }     return true;}int run_program(int N){    int total = 0;    for (int i; i < N; i++) {        if(isPrime(i)) total ++;    }    return total;}int main(){    int N = 10000000;    clock_t start,end;    start = clock();    int total = run_program(N);    end = clock();    cout << "total prime num is " << total;    cout << "\ncost " << (end - start) / ((double) CLOCKS_PER_SEC) << "s\n";    return 0;}
$ g++ isPrime.cpp -o isPrime$ ./isPrimetotal prime num is 664579cost 2.36221s


c++ C++ 确实牛逼,才 2.3 秒,不过好戏还在后头,现在我们使用 Numba 来加速一下,操作很简单,不需要改动原有的代码,先导入 Numba 的 njit,再在函数上方放个装饰器 @njit 即可,其他保持不变,代码如下:

import mathimport timefrom numba import njit# @njit 相当于 @jit(nopython=True) @njitdef is_prime(num):    if num == 2:        return True    if num <= 1 or not num % 2:        return False    for div in range(3, int(math.sqrt(num) + 1), 2):        if not num % div:            return False    return True@njitdef run_program(N):    total = 0    for i in range(N):        if is_prime(i):            total += 1    return totalif __name__ == "__main__":    N = 10000000    start = time.time()    total = run_program(N)    end = time.time()    print(f"total prime num is {total}")    print(f"cost {end - start}s")

运行一下,可以看出时间已经从 47.39 秒降低到 3 秒。

total prime num is 664579cost 3.0948808193206787s

相比 C++ 的 2.3 秒还是有一点慢,你可能会说 Python 还是不行啊。等一等,我们还有优化的空间,就是 Python 的 for 循环,那可是 1000 万的循环,对此,Numba 提供了 prange 参数来并行计算,从而并发处理循环语句,只需要将 range 修改为 prange,装饰器传个参数:parallel = True,其他不变,代码改动如下:

import mathimport timefrom numba import njit, prange@njitdef is_prime(num):    if num == 2:        return True    if num <= 1 or not num % 2:        return False    for div in range(3, int(math.sqrt(num) + 1), 2):        if not num % div:            return False    return True@njit(parallel = True)def run_program(N):    total = 0    for i in prange(N):        if is_prime(i):            total += 1    return totalif __name__ == "__main__":    N = 10000000    start = time.time()    total = run_program(N)    end = time.time()    print(f"total prime num is {total}")    print(f"cost {end - start}s")

现在运行一下:

python isPrime.pytotal prime num is 664579cost 1.4398791790008545s

才 1.43 秒,比 C++ 还快,Numba 真的牛逼!我又运行了两次,确认自己没看错,平均就是 1.4 秒

"Python比C++快吗"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

代码 C++ 运行 就是 语言 循环 编译 内容 函数 参数 性能 更多 知识 编译器 解释器 还是 速度 解释 不同 不行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发评估计划怎么写 东西湖定制软件开发团队 软件开发工作薪资如何 学生网络安全常识土豆视频 服务器的使能一般是怎么用的 洗板机软件开发 中国保险统计数据库 e3服务器内存 网络技术常用的编程语言 浙江网络技术服务参考价格 ubuntu 云服务器 长春电脑软件开发公司 软件开发 施工组织设计 电子信息服务业网络安全知识宣传 北京安信超维网络技术有限公司 网页设计和软件开发 面向对象模型和软件开发模型 南通手机软件开发定做价格 借软件开发公司资质招标 美国医药公司数据库管理 oracle服务器报价 华为云服务器默认安全组 打印服务器错误怎么办 余姚机械刀片服务器不二之选 网上购物软件开发计划书 ctf网络安全大赛2019 阜阳系统软件开发外包 青岛聚邦网络技术有限公司 dns服务器不一样能共享文件吗 未转变者服务器不能输入指令
0