Jython与Java大整数计算性能比较

一月 11th, 2010 发表评论 阅读评论

Jython来做大整数乘法相当轻松,不用做任何额外的处理,只需按int的做法去计算就行了。因此我就想,在Java环境里用Jython来做大整数计算会不会比纯用JavaBigInteger来计算还快呢?所以就有了下面的实验。

计算1n的阶乘的和,这里取n=2000

这里主要比较JythonJava的计算性能,就不把初始化Jython解释器的时间计算在内了。

代码:

/*求1至n的阶乘的和

 * */

import java.math.BigInteger;

import org.python.core.PyObject;

import org.python.util.PythonInterpreter;

 

 

public class BigMulti {

public static PythonInterpreter interp = new PythonInterpreter();  

 

public static void sumOfJava(int n){

BigInteger result = new BigInteger("0");

forint i=1;i<=n;++i){

BigInteger product = new BigInteger("1");

/*此处代码仅用于测试BigInteger的乘法性能,故不作优化*/

forint k=1;k<=i;++k){

product = product.multiply(

new BigInteger(String.valueOf(k)) );

}

result = result.add(product);

}

System.out.println("Java结果: "result.toString() );

}

 

public static void sumOfJython(int n){

interp.exec("def facto(n):\n  return reduce(lambda x,y:x*y,range(1,n+1))");

        interp.set("n", n );  

        interp.exec("b = sum( [ facto(i) for i in range(1,n+1) ] )"); 

        PyObject x = interp.get("b");  //x可能是PyInteger或者是PyLong

        System.out.println("Jython结果: " + x);

}

 

public static void main(String[] argv){

int n = 2000;

long t1 = System.currentTimeMillis();

sumOfJava(n);

long t2 = System.currentTimeMillis();

sumOfJython(n);

long t3 = System.currentTimeMillis();

 

System.out.println("Java用时:"+ (t2-t1));

System.out.println("Jython用时:"+ (t3-t2));

 

}

}

 

 

运行结果(注:要运行以上程序,需要在工程中添加jython的包jython.jar,这个包可以在http://www.jython.org/上找到并下载):

Java结果: 33179340598957383367370343958934763***(省略)

Jython结果: 33179340598957383367370343958934763***(省略)

Java用时:17734

Jython用时:18750

 

本以为Jython的计算过程会比纯Java的还快点,但是没有。毕竟Jython的代码要被jythonc编译为jython字节码再被java虚拟机执行的,经过这两重虚拟机后即使算法有一点优势都体现不出来了。而且我还怀疑,Jython里的大整数对象是以BigInteger为基础的,如果是那样的话,就不可能超越同样的Java代码的。

分类: python学习 技术笔记 标签: jython  大整数  BigInteger  java  比较  (830次阅读)

  1. 2010-01-20 at 11:12
    jpython主要是应用在什么地方啊
  2. 2010-03-11 at 21:48
    同样是基于JVM的语言,我觉得Java是最成熟的.速度的话已经不断优化过.