Jython与Java大整数计算性能比较
用Jython来做大整数乘法相当轻松,不用做任何额外的处理,只需按int的做法去计算就行了。因此我就想,在Java环境里用Jython来做大整数计算会不会比纯用Java的BigInteger来计算还快呢?所以就有了下面的实验。
计算1至n的阶乘的和,这里取n=2000。
这里主要比较Jython和Java的计算性能,就不把初始化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"); for( int i=1;i<=n;++i){ BigInteger product = new BigInteger("1"); /*此处代码仅用于测试BigInteger的乘法性能,故不作优化*/ for( int 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代码的。
最新评论