java、c/c++ 、python 等性能比较 杂谈(整理)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#-*-coding:utf-8-*-
import time
def isPrime(i):
for test in xrange(2,i):
if i % test == 0:
return False
return True
if __name__ == '__main__':
t1 = time.clock()
n_loops = 50000
n_primes = 0
for i in xrange(0,n_loops):
if isPrime(i):
n_primes += 1
t2 = time.clock()
print str(n_primes)
print "run time:%f s" % (t2 -t1)
基于numba加速代码
#-*-coding:utf-8-*-
import time
from numba import jit
@jit
def isPrime(i):
for test in xrange(2,i):
if i % test == 0:
return False
return True
@jit
def tp():
n_loops = 50000
n_primes = 0
for i in xrange(0,n_loops):
if isPrime(i):
n_primes += 1
return n_primes
if __name__ == '__main__':
t1 = time.clock()
n_primes = tp()
t2 = time.clock()
print str(n_primes)
print "run time:%f s" % (t2 -t1)
(这里插入一些知识:解释器与编译器 ,和 Python解释器)
我用python执行时间23秒,用pypy执行时间1.54秒,用numba加速为1.5秒,c语言在本机macos上执行时间1.3秒,java运行速度1.45秒(jre8),详细见图片,可见引入jit编译后,性能直逼c语言,而写python比写c容易太多,比java简洁,写代码速度也是非常非常重要。由于历史原因,很多python库用的c语言库,如pandas(pandas的矩阵计算用numpy优化过非常快,可能比手写c语言循环还要快),可以通过设计来分离c语言加速后的python代码和pure python,分别用不同的加速方法,如numba可以单独加速一个函数,把需要大量计算的放在一个函数用numba加速(numbapro支持显卡加速但是商业版的)。
所以只适当设计一下,python在一般计算问题下有这些解决方案下性能不是问题,实在不行,你还可以用boost::python来写个c/c++调用库来解决性能问题。
下面的测试说明,对于性能,原生python比较慢,在windows下python比linux,macos要快,用pypy后相当于java,c#速度,pypy,c#在windows下受益msvc表现较快,,go语言速度表现比较稳定,c语言理论上是最快,但受环境和编译器影响较大。对c#,java可能在GC垃圾回收时会表现不稳定,因为在oop中有大量计算后可能要回收垃圾内存对象,这个没有用到oop,只是纯计算,理论上还是c/c++语言最快。
python和java比,运行速度比java慢,java强大于改进n次的强大jre,但python在很多领域能调用很多现成的开源库,在数据分析中有优势,pyhton的代码比java要简洁,容易入门和使用。在优化的计算库帮助下,如numpy numba,pandas,scikit-learn,python的实际问题运算性能并不低于java。java主要是框架太多,相对复杂,java主要用于业务程序开发,符合软件工程理论,可伸缩性强,强类型有利于对程序的静态检查分析。java随着安卓,hadoop,spark的兴起,加入java语言的公司很多,性能也可以通过优化解决很多问题。很多服务器如ubuntu server,centos都默认支持python,而java虚拟机需要安装配置,python的安装使用也相对简单。python的库有开箱即用感,很多业务领域,你可能还在用oop写代码,考虑设计模式,用锄头挖沟时,而python调用挖掘机api已经炒菜完工开饭了,缺点是油耗比较大。
<img src="https://pic4.zhimg.com/v2-cd93521e47188074da40d54cb27ac84b_b.jpg" data-rawwidth="445" data-rawheight="300" class="origin_image zh-lightbox-thumb" width="445" data-original="https://pic4.zhimg.com/v2-cd93521e47188074da40d54cb27ac84b_r.jpg">
Python和c#相比,c#依赖强大的微软优化的.net虚拟机和强大vs ide,在windows平台下运行速度比java要快,但跨平台运行后如mono,速度就慢了,功能也不完全。c#的跨平台能力比不上python,c#比python要复杂,c#语法和java,c++借签,比较受编程人员喜好。mono的出现,unity3d用c#调用c++做游戏业务逻辑,可以在手机上流畅运行,体现了很多程序的性能在于良好的设计,可以把高性能的用c/c++写,用c#,java,python写容易变化的业务逻辑部分。c#在mon虚拟机下运行速度还可以,但linux控在服务器上有java,python,php,所以用mono做web比较小,从unity3d的成功来看,用c#做为业务脚本语言,用c++做库也能获取很高的性能。这是折中性能和开发速度矛盾的一种解决方案。很多复杂的业务语言用java,c#,在团队开发时易用性好,也说明了python的工程化比较差,对强类型的支持弱不适合静态分析,但python一但用强类型申明,那么是另一种java,也就不是快捷语言。在单纯的计算比较,各个虚拟机语言相差不多,其实除了现代很多业务系统瓶颈在io,在网络,在算法,在设计,你2秒运行1.2亿次,而没有数据库或缓存能做到2秒内记录完1.2亿条数据,都是1秒在1百万记录以下,如果走网络速度更慢,持续平均1秒能记录下几十万条数据顶天了,所以这些语言一直在等io完成任务。
python和go语言相比,go语言相对较新,go语言的库没有python的丰富,毕竟python发展了几十年,go语言最大的优点是协程,速度快,支持高并发,但任何支撑高并发的语言编程都不是一件易事,最大的缺点是,名称有google的go,所有很多其他的巨头公司本着竞争的观念对有类似商标的语言有抵制心理。而python是开源,用得公司特别多。go语言的语法如果能像c#,java类似,可能会发展得更好。很多语言为什么会用它,不在于语法,不在于性能,主要在于这个语言开发了什么成功的产品,另人会mock这个产品,用这个语言,Docker就是go语言开发的,适就于大规模分发容器。
python语言和c/c++相比,python开发速度比c/c++快,因为c/c++有指针,干什么之前,需要考虑好指针的技巧,指针弄不好,会造成内存泄露,一点内存泄露不要紧,但乘以时间乘数就会耗尽整个内存,因内存泄露造成的24h*365天服务器需要重启会造成实际经济损失,所以开发商业后台业务程序最好用无指针的java,php,python。但对用户来说python,java,c#,c/c++开发同样功能的程序,用户会选择c/c++,所以在软件业无数成功的标牌软件是c/c++,这是c/c++的成熟之处。c/c++主要是开发成本高,同样的程序可能python,c#一周,c++搞二个月很正常。但为了利益,花再多时间也有人干,如同现在一样有人用汇编写加密代码,用FPGA把程序做成芯片,追求的是极致的速度。c/c++的快是直接编译成二进制,无jit,vm,而python最快也只是调用c的扩展。开发成本也是很高的成本,高级的c++程序很贵,如在美国高级的c++程序员年薪在百万人民币以上,有时不是大应用时,用易于使用的语言,上高级点的电脑,上集群就可以了。如用python显卡来加速,买个显卡也就万元。c/c++适合精雕细琢,走精英路线,python适合快速开发,走大众路线,其实对于影响性能的部分可以结合使用,用python调用c/c++库。随着编译技术进步,电脑的计算力成本会随时间下降,计算力越来越强,最近的cpu多核主频高达5g,理论上比2.5g的cpu算力快一倍,用液氮超频可达6.7g,同样的核也比我电脑快了1.5倍(如果用高级c++语言程序员优化了1倍时间花费1人/年,显然超过了换计算机的钱),显卡在多核的支持下浮点运算能力也越来越高(可用NumbaPro,PyCUDA), HPC在云市场可以租用到,超级计算机也可以向有关组织租用机时测试,动态语言以其易用性开发成本低在很多领域可以取代高性能的编译语言,但极致的编译性能软件市场也是不断扩大的,很多行业算力跟不上,很多np-hard问题对算力需求不是线性增加能满足的,人们对性能的需要实际是越来越高,如世界竞争的超级计算机,比特币矿机,深度学习算法。谁都不可以取代谁,而是大家都结合发展了。用什么语言没有好坏之分,关键是在目标程序追求的是什么。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实际上我心中觉得最好的x语言是
java的跨平台+c#的ide和语法+python的库+c++语言的性能+go语言的协程
python在macos执行时间23.3秒,pypy在macos执行时间1.54秒,python在ubuntu下测试为13.5秒,pypy在ubuntu下测试为2.3秒。
<img src="https://pic1.zhimg.com/v2-ef43ab1b83b46b8aaeac63b784ffae00_b.png" data-rawwidth="1326" data-rawheight="872" class="origin_image zh-lightbox-thumb" width="1326" data-original="https://pic1.zhimg.com/v2-ef43ab1b83b46b8aaeac63b784ffae00_r.png">
用numba加速在macos结果为1.5秒。
<img src="https://pic2.zhimg.com/v2-bdc0cd3176d71e004c40eed3b3bc1d0d_b.png" data-rawwidth="1330" data-rawheight="872" class="origin_image zh-lightbox-thumb" width="1330" data-original="https://pic2.zhimg.com/v2-bdc0cd3176d71e004c40eed3b3bc1d0d_r.png">python在windows7下运行时间为7.4秒,pypy在windows7下的运行时间为0.6秒。
<img src="https://pic2.zhimg.com/v2-e3636599f99c444ea55f60cfc46ec7f1_b.png" data-rawwidth="677" data-rawheight="442" class="origin_image zh-lightbox-thumb" width="677" data-original="https://pic2.zhimg.com/v2-e3636599f99c444ea55f60cfc46ec7f1_r.png">
用不同python编译器在win7下运行的结果,pypy为0.56秒,jython为4.7秒,IronPython为5.2秒,python为6.5秒
<img src="https://pic3.zhimg.com/v2-53e2829b2061472ecfd987a7df7f8356_b.png" data-rawwidth="673" data-rawheight="440" class="origin_image zh-lightbox-thumb" width="673" data-original="https://pic3.zhimg.com/v2-53e2829b2061472ecfd987a7df7f8356_r.png">
c语言在macos运行结果1.34秒(LLVM)
<img src="https://pic2.zhimg.com/v2-26b375b22723e09c0d701909e7072ccd_b.png" data-rawwidth="1596" data-rawheight="1480" class="origin_image zh-lightbox-thumb" width="1596" data-original="https://pic2.zhimg.com/v2-26b375b22723e09c0d701909e7072ccd_r.png">c语言(vc++13)在windows7下的运行时间为0.34秒,为什么会这么快,可能和msvc的编译器对windows平台数字计算优化有关。包括上面的windows下的python,用msv编译版后速度较macos要快。c语言我在ubuntu下用打-O2优化,用gcc是2秒,用clang是1.88秒。c语言(vc++13)在windows7下的运行时间为0.34秒,为什么会这么快,可能和msvc的编译器对windows平台数字计算优化有关。包括上面的windows下的python,用msv编译版后速度较macos要快。c语言我在ubuntu下用打-O2优化,用gcc是2秒,用clang是1.88秒。
<img src="https://pic1.zhimg.com/v2-b3fd891acdf118aeef316f2c6f823748_b.png" data-rawwidth="677" data-rawheight="442" class="origin_image zh-lightbox-thumb" width="677" data-original="https://pic1.zhimg.com/v2-b3fd891acdf118aeef316f2c6f823748_r.png">c语言打开-O2二级优化,用llvm和gcc,速度差不多都在1.2秒,clang要快点c语言打开-O2二级优化,用llvm和gcc,速度差不多都在1.2秒,clang要快点
<img src="https://pic4.zhimg.com/v2-33f562eebfffaf70aff1ddb00a25eedf_b.png" data-rawwidth="1322" data-rawheight="874" class="origin_image zh-lightbox-thumb" width="1322" data-original="https://pic4.zhimg.com/v2-33f562eebfffaf70aff1ddb00a25eedf_r.png">
java在macos运行结果1.4秒,我在ubuntu上测试为2秒。
<img src="https://pic2.zhimg.com/v2-7c0906e6cb469e38920a39c06db110b1_b.png" data-rawwidth="1578" data-rawheight="1286" class="origin_image zh-lightbox-thumb" width="1578" data-original="https://pic2.zhimg.com/v2-7c0906e6cb469e38920a39c06db110b1_r.png">
java在windows7下的执行时间为1.23秒
<img src="https://pic1.zhimg.com/v2-37f99113ffe9b71fca54e0ac291ad774_b.png" data-rawwidth="714" data-rawheight="651" class="origin_image zh-lightbox-thumb" width="714" data-original="https://pic1.zhimg.com/v2-37f99113ffe9b71fca54e0ac291ad774_r.png">go语言测试代码如下:go语言测试代码如下:
package main
import (
"fmt"
"time"
)
func main() {
n_loops := 50000
n_primes := 0
t1 := time.Now() // get current time
for i := 0;i < n_loops;i++ {
if isPrime(i) {
n_primes++
}
}
t2 := time.Since(t1)
fmt.Println("Time taken=", t2)
fmt.Println("primes found",n_primes);
}
func isPrime(i int)(bool){
for test := 2; test < i; test++{
if i % test == 0 {
return false
}
}
return true
}
go语言在macos测试结果1.1秒,我在ubuntu下测试为0.91秒
&amp;amp;amp;lt;img src="https://pic3.zhimg.com/v2-0a9d740d2cd24515942eeaa9e5b40b42_b.png" data-rawwidth="1336" data-rawheight="878" class="origin_image zh-lightbox-thumb" width="1336" data-original="https://pic3.zhimg.com/v2-0a9d740d2cd24515942eeaa9e5b40b42_r.png"&amp;amp;amp;gt;
go语言在windows 7平台下1.18秒,你还可以用Grumpy,把python先转换成go语言,再编译go语言成二进制实现加速。
&amp;amp;amp;lt;img src="https://pic4.zhimg.com/v2-99dc07091e02a3ba23bf794fa6607d53_b.jpg" data-rawwidth="677" data-rawheight="442" class="origin_image zh-lightbox-thumb" width="677" data-original="https://pic4.zhimg.com/v2-99dc07091e02a3ba23bf794fa6607d53_r.jpg"&amp;amp;amp;gt;
c#基于mono在macos执行时间2.84秒,在ubuntu上测试为1.8秒。
&amp;amp;amp;lt;img src="https://pic4.zhimg.com/v2-d432281888ccbae38d385999167f0813_b.png" data-rawwidth="1302" data-rawheight="874" class="origin_image zh-lightbox-thumb" width="1302" data-original="https://pic4.zhimg.com/v2-d432281888ccbae38d385999167f0813_r.png"&amp;amp;amp;gt;c#基于windows7执行时间1.17秒
&amp;amp;amp;lt;img src="https://pic4.zhimg.com/v2-aee4a1bec619e9528be215f4330f7f13_b.png" data-rawwidth="677" data-rawheight="442" class="origin_image zh-lightbox-thumb" width="677" data-original="https://pic4.zhimg.com/v2-aee4a1bec619e9528be215f4330f7f13_r.png"&amp;amp;amp;gt;
c#代码如下:
using System;
namespace TestPrime
{
class MainClass
{
private static long LoopCount=0L;
private static bool isPrime(long i)
{
for (long test = 2; test < i; test++)
{
if (i % test == 0)
{
return false;
}
LoopCount++;
}
return true;
}
public static void Main(string[] args)
{
TimeSpan start_time = DateTime.Now.TimeOfDay;
long n_loops = 50000;
long n_primes = 0;
for (long i = 0; i < n_loops; i++)
{
if (isPrime(i))
{
n_primes++;
}
}
TimeSpan end_time = DateTime.Now.TimeOfDay - start_time;
Console.WriteLine(n_primes + " primes found");
Console.WriteLine("Time taken = " + end_time.TotalSeconds);
Console.WriteLine("LoopCount = " + LoopCount);
}
}
}
java、c/c++ 、python 等性能比较 杂谈(整理)的更多相关文章
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...
- [转] Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- Python代码性能优化技巧
摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- 为什么用 Java:一个 Python 程序员告诉你
这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...
- 在Java中调用Python
写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题 ...
- Atitit.http代理的实现 代码java php c# python
Atitit.http代理的实现 代码java php c# python 1. 代理服务器用途 代理服务器看成是一种扩展浏览器功能的途径.例如,在把数据发送给浏览器之前,可以用代理服务器压缩数据 调 ...
- JAVA通过XPath解析XML性能比较(原创)
(转载请标明原文地址) 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种 ...
随机推荐
- 【笨木头Lua专栏】基础补充05:迭代器番外篇
关于迭代器的内容, 另一点点,只是已经无关紧要了.应该算是一种扩展吧.就一起来开开眼界好了~ 笨木头花心贡献.哈?花心?不.是用心~ 转载请注明,原文地址: http://www.benmutou.c ...
- C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
1.赋值兼容规则 (1)派生类对象能够给基类对象赋值,这样的情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:可是不同意将一个基类的对象赋值给一个派生类. (2)能够将派生类对象的地址赋给基类 ...
- NFS CIFS SAMBA 的联系和区别
Common Internet File System, CIFS Server Message Block, SMB Network File System, NFS 在早期网络世界当中,档案数据在 ...
- 使用DBCA工具创建自己的数据库
ylbtech-Oracle:使用DBCA工具创建自己的数据库 DBCA创建数据库 默认安装的Oracle数据库一般不能满足实际应用的需求,例如数据库名称.数据库块的大小等都需要修改,那么我们应该自 ...
- wiggle-subsequence
// 参考了:https://discuss.leetcode.com/topic/51893/two-solutions-one-is-dp-the-other-is-greedy-8-lines ...
- App优化 StrictMode 严格模式
StrictMode简介 StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例.一旦检测到策略违例policy violation,你将获得警告,其包含了一个栈tra ...
- retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
项目地址:https://github.com/baiqiantao/retrofit2_okhttp3_RxJava_butterknife.git <uses-permission andr ...
- 默认网关和默认路由 —— Cisco CCNA – Default Gateway & Default Routes
原文:https://www.certificationkits.com/cisco-certification/ccna-articles/cisco-ccna-intro-to-routing-b ...
- [Javascript] Prototype 2 Object.create()
function Fencepost (x, y, postNum){ this.x = x; this.y = y; this.postNum = postNum; this.connections ...
- Python批量处理CSV文件
#encoding: utf-8 __author__ = 'DELL' import csv import glob import datetime import sys import os rel ...