千家信息网

Python比C++快吗

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇内容介绍了"Python比C++快吗"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!众所周知,Py
千家信息网最后更新 2024年11月23日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安全错误 数据库的锁怎样保障安全 安控科技是工业互联网企业吗 网络安全法白山 河北超频服务器厂家供应 win7邮件服务器配置 网络安全模式下连接网络不成功 惠尔顿网络安全审计密码 软件开发甲级资质到期 宁波企业网络安全准入控制哪家好 安徽新华互联网科技学校怎么样 沂源县有软件开发吗 网络文明网络安全主题班会视频 烽火科技软件开发面试 租个服务器玩游戏 上海网络安全论坛 静安区一站式软件开发市场价格 国家网络安全法图解 和网络安全有关的小故事 租服务器显卡玩游戏 联想与联想中国pc及服务器工厂 山东安卓软件开发哪里好 陕西省丝路杯网络安全大赛 怎么样降低服务器安全性 八大数据库食品期刊 2018湖南省网络安全事件 50t服务器主机主板 软件开发者拥有软件版权 腐蚀被服务器管理踢了怎么办 蓟州区电子网络技术质量保证 云服务器容量 杨浦区数据软件开发管理方法
0