其实用python的人应该都是不关注它性能的人,毕竟写python确实很愉快
PHP的核心维护者花了很多的心血却提高底层的解释器效率,为什么Python的维护者不去呢?
程序员都喜欢用数据说话,这里我用的python版本是Python 3.6.2(64位),php版本是PHP 7.0.12(64位),node版本是v6.11.0(64位),Go 1.8.3(64位),C# 基于.Net 4.0,lua 5.1.4
对比
python
import time
calNum = 100000000
def test():
sum = 0
for x in range(1, calNum + 1):
sum += x
return sum
start = time.time()
test()
end = time.time()
print(end - start)
PHP
<?php
$calNum = 200000000;
function test() {
$sum = 0;
global $calNum;
for ($i = 0; $i < $calNum; $i++) {
$sum += $i;
}
return $sum;
}
$start = time();
test();
$end = time();
echo ($end - $start);
nodeJS
let calNum = 200000000;
function test() {
let sum = 0;
for (var i = 0; i < calNum; i++) {
sum += i;
}
return sum;
}
let start = new Date().getTime();
test();
let end = new Date().getTime();
console.log((end - start) / 1000);
Golang
package main
import (
"fmt"
"math"
"time"
)
var calNum = 200000000
func test() int {
sum := 0
for i := 0; i < calNum; i++ {
sum += i
}
return sum
}
func main() {
start := time.Now().UnixNano()
test()
end := time.Now().UnixNano()
fmt.Println(float64(end - start) / math.Pow(10, 9))
}
C#
private static int calNum = 100000000;
static int test()
{
int sum = 0;
for (int i = 0; i < calNum; i++)
{
sum += i;
}
return sum;
}
static void Main(string[] args)
{
double start = ConvertDateTimeInt(DateTime.Now);
test();
double end = ConvertDateTimeInt(DateTime.Now);
Console.WriteLine(end - start);
Console.ReadLine();
}
/// <summary>
/// DateTime时间格式转换为Unix时间戳格式
/// </summary>
/// <param name="time"> DateTime时间格式</param>
/// <returns>Unix时间戳格式</returns>
public static double ConvertDateTimeInt(DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (time - startTime).TotalSeconds;
}
lua
calNum = 200000000
function test()
local sum = 0
for i=0,calNum - 1 do
sum = i + sum
end
return sum
end
local start = os.time()
test()
local endTime = os.time()
print(endTime - start)
执行时间(1亿次,2亿次)
python
C:\Users\mh\Desktop>python cal.py
7.873001337051392
C:\Users\mh\Desktop>python cal.py
17.40298104286194
PHP
C:\Users\mh\Desktop>php cal.php
5
C:\Users\mh\Desktop>php cal.php
13
PHP 7.1(新下载的)
C:\Users\mh\Desktop>php cal.php
5
C:\Users\mh\Desktop>php cal.php
10
nodeJS
C:\Users\mh\Desktop>node cal.js
1.288
C:\Users\mh\Desktop>node cal.js
2.603
Golang
C:\Users\mh\Desktop>go run cal.go
0.0519903
C:\Users\mh\Desktop>go run cal.go
0.1080017
C#
0.685999155044556
1.52999567985535
lua(just for fun)
C:\Users\mh\Desktop>cal.lua
1
C:\Users\mh\Desktop>cal.lua
2
PHP还是比python快的,不过在脚本语言中node更快,Go挺快的
python并不一定慢,许多Python的科学计算库通过用C来编写可以获得和全用c或者c++写的程序相同或者慢一到两倍的体验。
很多人认为他慢。他其实也确实慢。
一是GIL,其实GIL也只是CPython python解释器的特性,其主要是在多核机器上python无法获得多核所带来的性能优势。单核其实就差不多了。
楼下起风了不认可。首先大多数Python程序都是运行在CPython上的。无数用c语言为Python编写的好的库也是只能运行在cpyhon上的。所以GIL是大多数Python程序绕不开的东西。你说多进程可以解决。但是这也导致了一个问题就是进程间的数据共享问题。因为不在一个进程中共享内存空间这种高效的共享方式不能使用(当然GIL也是为了处理多线程共享内存所带来的风险而设置的。)这样你多线程间通信也会带来性能的损耗。当然你说可以通过多线程解决也没错,但是也不能说GIL不是导致大多数python慢的原因。
二是python是一门解释形语言,其是边运行边将python字节码编译成系统可以执行的可执行代码。这会带来一定的性能损耗,但是一个程序的快慢主要还是由其热点部分决定。通过将热点部分使用C语言编写,基本就可以获得很好的性能。
楼下起风了说python运行一次后编码就完成了。我想他可能没有理解解释型语言的编译。 Python在运行前编译好的文件是Python字节码。如果没有Python虚拟机是不能运行的。当在运行的时候Python虚拟机又吧Python字节码翻译成可以被CPU执行的二进制字节码。而像C语言这种是直接编译连接就可以生成直接被机器执行的二进制码。
其实对于大型应用影响其性能的首先是架构其次是程序编写逻辑然后是语言特性。大部分系统瓶颈都输数据库读取。加个redis缓存就可以获得不错的性能提升。 ins还不是用django撑起了全球最大图片分享网站。
手机打的错别字可能多一点??
四种不同的写法
test time: 7.10620498657
test1 time: 4.30882191658
test2 time: 4.70718193054
test3 time: 8.60779190063
四种不同的写法 获得时间也不同。 我之后再写一个链接了c语言库的实例补上。