加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

全方位测试 Python比Java 更快,性能更好

(2012-03-30 16:48:13)
标签:

it

分类: Java
【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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有