首页 > 编程知识 正文

python java c 比较(c语言javapython区别)

时间:2023-05-05 08:54:25 阅读:103919 作者:1281

这是我用所有三种语言运行矩阵乘法时发生的情况

dmdzxc candelo在Unsplash上拍摄的照片

在过去的两年中,我为C语言做了大量的实现工作。我之所以选择C语言而不是其他语言,是因为人们普遍认为C代码比其他流行的编程语言(例如Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)和Python)运行得更快。但是,即使我一直对C的速度(或C实际上最快)感到好奇,我自己也没有做任何实验来证实这一说法。最后,我决定进行一些实验,以比较Java 语言(一种计算机语言,尤用于创建网站)和计算机编程语言的性能。本文是关于我进行的实验和获得的结果的文章。

本实验

我决定使用所有三种语言进行矩阵乘法。矩阵的大小为2048 x 2048(即每个矩阵的乘法和加法运算为8,589,934,592),我为它们填充了0.0到1.0之间的随机值(使用随机值而不是对所有三种语言使用完全相同的矩阵的影响可以忽略不计)。我将每个实验运行了五次,并计算了平均运行时间。

C代码

#包含stdlib.h

#包含stdio.h

#包括时间h .

#定义n 2048

双a[n][n];

双b[n][n];

双c[n][n];

int main(){ 0

//用0.0到1.0之间的随机值填充矩阵

for(int I=0;I n;I){ 0

for(int j=0;j n;j ) {

a[I][j]=(双)RAND()/(双)RAND _ MAX

b[I][j]=(双)RAND()/(双)RAND _ MAX

c[I][j]=0;

}

}

结构时间表开始,结束;

花费了双倍的时间;

//矩阵乘法

时钟_获取时间(时钟_实时,开始);

for(int I=0;I n;I){ 0

for(int j=0;j n;j ) {

for(int k=0;k n;k){ 0

c[I][j]=A[I][k]* B[k][j];

}

}

}

时钟_获取时间(时钟_实时,结束);

浪费的时间=(结束。电视_秒-开始。TV _ sec)(结束。TV _ nsec-开始。TV _ nsec)/100000000.0;

printf('经过的时间(秒): %f n ',花费的时间_秒);

返回0;

}

Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)代码

导入Java。乌提尔。随机的;

公共类矩阵乘法

静态int n=2048

静态双[][] A=新双[n][n];

静态双[][] B=新双[n][n];

静态双[][] C=新双[n][n];

公共静态void main(String[]参数){ 0

//用0.0到1.0之间的随机值填充矩阵

Random r=new Random();

for(int I=0;I n;I){ 0

for(int j=0;j n;j ) {

a[I][j]=r . NextDouble();

b[I][j]=r . NextDouble();

c[I][j]=0;

}

}

长启动=系统。nano time();

//矩阵乘法

对于(在

t i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { C[i][j] += A[i][k] * B[k][j]; } } } long stop = System.nanoTime(); double timeDiff = (stop - start) * 1e-9; System.out.println("Elapsed time in seconds: " + timeDiff); } }

Python代码

import random import time n = 2048 #populate the matrices with random values between 0.0 and 1.0 A = [[random.random() for row in range(n)] for col in range(n)] B = [[random.random() for row in range(n)] for col in range(n)] C = [[0 for row in range(n)] for col in range(n)] start = time.time() #matrix multiplication for i in range(n): for j in range(n): for k in range(n): C[i][j] += A[i][k] * B[k][j] end = time.time() print("Elapsed time in seconds %0.6f" % (end-start))

如何编译和运行

#C gcc MatrixMultiplication.c -o matrix ./matrix #Java javac MatrixMultiplication.java java MatrixMultiplication #Python python MatrixMultiplication.py

运行时间

根据这些结果,C比Java慢2.34倍,Python比Java慢33.34倍。

等待!!! C应该不是最快的吗???

实际上,这是不公平的比较。 当我们编译Java程序时,即使没有任何优化标志,Java JIT(即时)编译器也会自动执行优化。 但是,对于GCC(编译C程序),情况并非如此,我们必须显式设置优化标志。

因此,我在编译C程序时使用了-O2和-O3优化标志,并再次进行了实验。

gcc -O2 MatrixMultiplication.c -o matrix./matrixgcc -O3 MatrixMultiplication.c -o matrix./matrix

新的经过时间

现在,Java代码比C [-O3]慢1.69倍,而Python代码慢56倍。 我做出了正确的决定(或者很幸运:-)),选择了C而不是其他编程语言。

总结结果

讨论结果

· Python相对非常慢,因为C是经过编译的,而Python是被解释的。 编译器一次将C代码转换为机器代码。 另一方面,解释器必须读取,解释和执行每一行代码,并更新机器状态(这会增加很多开销)。 将程序编译为机器代码时,CPU可以直接执行它。 但是,当涉及到解释器时,CPU将运行解释器,并且解释器本身将执行程序。 (如果您对编译器和解释器感兴趣,请阅读Vaidehi Joshi撰写的精彩文章)

· 这就是使Python非常灵活的原因。 Python牺牲了一点性能来提供更多的灵活性/高级编程功能(如果不使用C语言指定数据类型,则不能将变量初始化为n = 100,但是可以在Python中进行初始化)。

· JIT(Java编译器)位于C和Python之间。 首次执行代码时,将对其进行解释。 但是,当一段代码频繁执行时,它会实时编译为机器代码,并且进一步的执行将使用编译后的版本。

本文的灵感来自Charles E. Leiserson教授关于性能工程的演讲,我修改了他使用的源代码以满足我的要求。

我用来运行实验的机器的配置[处理器:Intel(R)Core(TM)i7–5500U CPU @ 2.40GHz,RAM:12Gb DDR3,OS:Ubuntu 18.04.4]

(本文翻译自Gunavaran Brihadiswaran的文章《A Performance Comparison Between C, Java, and Python》,参考:https://medium.com/swlh/a-performance-comparison-between-c-java-and-python-df3890545f6d)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。