【CSDN
编译】在正式展开我的观点之前,我想说这只是表达我的个人观点,并非代表科学和权威的论断。我这样做,只是为了给学习编程语言的人们一个参考。
对于初学编程语言的新人而言,如何选择编程语言,首先考虑的问题是哪种语言的运行速度更快。Python 和Java 同是两大语言,在这里我对二者的运行速度做了实例演示。
针对不同功能和模块的测试,我分别对Java 和Python 写了功能相同的测试代码,并各自反复测试了三次,取了平均值。结果如下:
Test
|
Java
|
Python
|
Comparison
|
Standard
Output
|
138.85
|
30.58
|
Python 4.5X Faster than
Java
|
Hashtable
|
17.0
|
8.22
|
Python 2X Faster than
Java
|
I/O
|
56.72
|
47.36
|
Python 1.2X Faster than
Java
|
List
|
5.94
|
14.32
|
Java 2.4X Faster than
Python
|
Native
Methods
|
2.475
|
7.92
|
Java 3.2X Faster than
Python
|
Interpreter
Initialisation
|
0.25
|
0.04
|
Python 6.3X Faster than
Java
|
Object
Allocation
|
23.65
|
211.11
|
Java 8X Faster than
Python
|
Interpreter
Speed
|
0.43
|
2.29
|
Java 5.3X Faster than
Python
|
时间的单位是秒
再一次,我要说这只是在我的电脑下的大概时间。我的Java
(JDK 1.1.7B,
blackdown),我的系统(Debian GNU
Linux 2.2),我的 (Python
1.5.2) 。
Test-By-Test
ConsoleTest
|
Python
|
Java
|
for x in xrange(1000000):
print x
|
public class ConsoleTest {
public static void main(String[] args) {
for (int i = 0; i < 1000000; i++) {
System.out.println(i);
}
}
}
|
|
Hashtest
|
Python
|
Java
|
for i in
xrange(1000):
x={}
for
j in xrange(1000):
x[j]=i
x[j]
|
import
java.util.Hashtable;
public class HashTest
{
public
static void main(String[] args) {
for
(int i = 0; i < 1000; i++) {
Hashtable
x = new Hashtable();
for
(int j = 0; j < 1000; j++) {
x.put(new
Integer(i), new Integer(j));
x.get(new
Integer(i));
}
}
}
}
|
|
IOTest
|
Python
|
Java
|
f=open('scratch','wb')
for i in
xrange(1000000):
f.write(str(i))
f.close()
|
import
java.io.*;
public class
IOTest
{
public
static void main(String[] args) {
try
{
File
f = new File("scratch");
PrintWriter
ps = new PrintWriter(new OutputStreamWriter
(new
FileOutputStream(f)));
for
(int i = 0; i < 1000000; i++) {
ps.print(String.valueOf(i));
}
ps.close();
}
catch(IOException
ioe) {
ioe.printStackTrace();
}
}
}
|
|
ListTest
|
Python
|
Java
|
for i in
xrange(1000):
v=['a','b','c','d','e','f','g']
for
j in xrange(1000):
v.append(j)
v[j]
|
import
java.util.Vector;
public class ListTest
{
public
static void main(String[] args) {
for
(int i = 0; i < 1000; i++) {
Vector
v = new Vector();
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
v.addElement("e");
v.addElement("f");
v.addElement("g");
for
(int j = 0; j < 1000; j++) {
v.addElement(new
Integer(j));
v.elementAt(j);
}
}
}
}
|
|
NativeTest
|
Python
|
Java
|
from pynative import
*
for i in
xrange(1000000):
hello()
|
public class
NativeTest
{
public
native void nativeMethod();
static
{
System.loadLibrary("javanative");
}
public
static void main(String[] args) {
NativeTest
nt = new NativeTest();
for
(int i = 0; i < 1000000; i++)
{
nt.nativeMethod();
}
}
}
|
|
|
Python C
Module
|
Java C
Module
|
#include
"Python.h"
static
PyObject*
pynative_hello(self,args)
PyObject
*self;
PyObject
*args;
{
printf("Hello,
world!\n");
Py_INCREF(Py_None);
return
Py_None;
}
static PyMethodDef
NativeMethods[] = {
{"hello",
pynative_hello, METH_VARARGS},
{NULL,
NULL},
};
void
initpynative()
{
(void)
Py_InitModule("pynative", NativeMethods);
}
|
--- Autogenerated
NativeTest.h ---
#include
#ifndef
_Included_NativeTest
#define
_Included_NativeTest
#pragma
pack(4)
typedef struct
ClassNativeTest {
char
PAD;
}
ClassNativeTest;
HandleTo(NativeTest);
#pragma
pack()
#ifdef
__cplusplus
extern "C"
{
#endif
extern void
NativeTest_nativeMethod(struct HNativeTest *);
#ifdef
__cplusplus
}
#endif
#endif
---
#include
<stdio.h>
#include
<jni.h>
#include
"NativeTest.h"
JNIEXPORT void
JNICALL
Java_NativeTest_nativeMethod(JNIEnv *env, jobject
obj)
{
printf("Hello
world!\n");
}
|
|
NoTest
|
Python
|
Java
|
|
public class NoTest {
public static void main(String[] args){} }
|
|
ObjectTest
|
Python
|
Java
|
class ObjectTest:
pass
for i in
xrange(1000):
root=ObjectTest()
for
j in xrange(10000):
root.next=ObjectTest()
root=root.next
|
public class ObjectTest
{
public
ObjectTest next;
public
static void main(String[] args) {
for
(int i = 0; i < 1000; i++) {
ObjectTest
root = new ObjectTest();
for
(int j = 0; j < 10000; j++) {
root.next=new
ObjectTest();
root=root.next;
}
}
}
}
|
|
SpeedTest
|
Python
|
Java
|
for x in
xrange(1000000):
pass
|
public class SpeedTest
{
public
static void main(String[] args) {
for
(int i = 0; i < 1000000; i++);
}
}
|
|
结论
Python程序比Java 更易于编写。我花了大概十五分钟写完以上全部的测试代码,写Java却用了近一个小时。而且,第一次运行我没有在Python 中发现任何问题,运行Java时却发现了三处。
Java 的代码比Python长。实际上,看看代码你会知道大概长三倍。我数了一下,我总共写了:Python——921字节;Java——2724字节。
Java也很快,但更适用于系统级应用。在我看来,c -> c++
-> Java -> python 是这样一个顺序:从面向系统的底层编程到面向应用的高层编程。
解释
许多Java 的fans一定会问我为什么用JDK 1.1?我知道1.2 的运行会比这好些,我也意识到我并没有在Java 测试时使用最佳运算。但要明白,我们的测试是基于现在主流配置和平台下二者的性能,而JDK 1.2 在大部分平台上还没有普及。(我说的大部分是指,MacOS, BeOS,
OS/2)。所以我选择的是:Python 1.5.2 ,JDK 1.1。
加载中,请稍候......