解释型程序python\java与编译型程序C在IO以及运行上的效率差异
最近特别喜欢使用python编写一些短小而且实用的程序,并且由于专业上的需求(python在科学程序上的应用非常的广泛,我们实验室的密码库基本上都是含有C封装的python模块),所以我想将python应用到更广泛的范围。但是据说python在解释上的效率相当的不理想,由此我想到了三个问题:
1.如果写一个python版的快速排序,测试一下,运行的时间有多少
2.再写一个java版本的实现,与python的运行时间进行对比,看看他们在虚拟机的效率上到底有多大差别
3.再写一个C语言的编译型程序,与python和java进行对比,看一下编译型程序与解释性程序的差距有多大,看看不论是java还是python,解释型的程序与编译型的程序在运行时间上有多大的差距
扩展的课题:
1.如果是考虑到web上的问题,那么IO效率将是一个很重要的考量方向,所以可以再将需要排序的数据通过从文件读取的方式来加载,测试3种语言的IO效率。(其实在IO的问题上,我一直不是很清楚IO的内在运行机制,不论是编译型语言,还是解释型语言,我总感觉IO的效率是操作系统相关的,是系统调用相关的,不知道哪个大神能否解释一下)
2.如果将C的快速排序作为python的扩展效果会是怎么样的?
我实现的python版本快速排序如下所示(不知道是不是最好的实现方式):
1 ''' 2 QucikSort algorithm 3 Description:For QuickSort,there's two way to realise: 4 First, base on recursion. 5 Second, based on non-recursion 6 7 Date:2014-01-12 8 Author:DongyuanShi 9 Version:0.1 10 ''' 11 12 import time 13 14 #here,we use a list of emulate the data array. 15 #But in my opinion, list is not the most efficient 16 #way to realize. So If there's a much better way to 17 #realize a static array like C. 18 def qucikSort(datarray): 19 length=len(datarray) 20 start=0 21 end=length-1 22 qucikSortCoreNonRecursion(datarray,start,end) 23 24 25 def qucikSortCore(datarray,start,end): 26 27 if start<end: 28 mid=partition(datarray,start,end) 29 qucikSortCore(datarray,start,mid-1) 30 qucikSortCore(datarray,mid+1,end) 31 32 33 def qucikSortCoreNonRecursion(datarray,start,end): 34 35 stack=[] 36 if start<end: 37 stack.append(start) 38 stack.append(end) 39 40 while len(stack)!=0: 41 end=stack.pop() 42 start=stack.pop() 43 mid=partition(datarray,start,end) 44 if mid+1<end: 45 stack.append(mid+1) 46 stack.append(end) 47 if start<mid-1: 48 stack.append(start) 49 stack.append(mid-1) 50 51 52 53 54 55 56 def partition(datarray,start,end): 57 58 tag=datarray[end] 59 i=start-1 60 61 for j in xrange(start,end): 62 if datarray[j]<=tag: 63 i=i+1 64 temp=datarray[i] 65 datarray[i]=datarray[j] 66 datarray[j]=temp 67 i=i+1 68 temp=datarray[i] 69 datarray[i]=tag 70 datarray[end]=temp 71 72 return i 73 74 75 76 77 if __name__=='__main__': 78 79 data=[5,4,3,2,1,10,9,8,7,6] 80 data=data*100 81 82 start=time.clock() 83 qucikSort(data) 84 end=time.clock() 85 86 #print data 87 print 'runtime:',end-start 88 print data
实现的JAVA版本的排序算法如下:
import java.util.Stack; // QucikSort algorithm // Description:For QuickSort,there's two way to realise: // First, base on recursion. // Second, based on non-recursion // Date:2014-01-26 // Author:DongyuanShi // Version:0.1 public class quickSort { public void sort(int[] data){ this.qucikSortCoreNonRecursion(data,0,data.length-1); } private void sortCore(int[] data,int start,int end){ if (start<end){ int mid; mid=this.partition(data,start,end); this.sortCore(data,start,mid-1); this.sortCore(data,mid+1,end); } } private int partition(int[] data,int start,int end){ int tag; int i,j,temp; tag=data[end]; i=start-1; for(j=start;j<end;j++){ if(data[j]<=tag){ i=i+1; temp=data[i]; data[i]=data[j]; data[j]=temp; } } i=i+1; temp=data[i]; data[i]=tag; data[end]=temp; return i; } public void qucikSortCoreNonRecursion(int[] datarray,int start,int end){ Stack<Integer> stack=new Stack<Integer>(); if(start<end){ stack.push(start); stack.push(end); } int mid; while(!stack.empty()){ end=stack.pop(); start=stack.pop(); mid=this.partition(datarray,start,end); if(mid+1<end){ stack.push(mid+1); stack.push(end); } if(start<mid-1){ stack.push(start); stack.push(mid-1); } } } public static void main(String args[]){ quickSort qs=new quickSort(); int[] data=new int[10000]; for(int i=0;i<1000;i++){ for(int j=0;j<10;j++){ data[i*10+j]=j+1; } } long startTime=System.currentTimeMillis(); qs.sort(data); long endTime=System.currentTimeMillis(); System.out.println("Time:"+startTime); System.out.println("Time:"+endTime); System.out.println("Time:"+(endTime-startTime)); } }
C语言版本的快速排序如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include "quickSort.h" #include "stack.h" void initArray(int data[],int length){ int i; int randomNum; for(i=0;i<length;i++){ randomNum=rand()%100; data[i]=randomNum; } } void printArray(int data[],int length){ int i; for(i=0;i<length;i++){ printf("%d,",data[i]); } printf("\n"); } void quickSort(int data[],int length){ quickSortCore(data,0,length-1); } void quickSortCore(int data[],int start,int end) { int mid; if(start<end){ mid=partition(data,start,end); quickSortCore(data,start,mid-1); quickSortCore(data,mid+1,end); } } int partition(int data[],int start,int end) { int seed=data[end]; int i,j; int mid; i=start-1; for(j=start;j<end;j++){ if(seed>=data[j]){ i+=1; mid=data[i]; data[i]=data[j]; data[j]=mid; } } i+=1; mid=data[i]; data[i]=data[j]; data[j]=mid; return i; } void quickSortNonRecursion(int data[],int length) { STACK stack; initStack(&stack); push(&stack,0); push(&stack,length-1); while(!isEmpty(&stack)){ int start,end; int mid; pop(&stack,&end); pop(&stack,&start); if(start<end){ mid=partition(data,start,end); push(&stack,mid+1); push(&stack,end); push(&stack,start); push(&stack,mid-1); } } } int main(int argc,char* argv[]) { int data[2000]; double startTime,endTime; initArray(data,2000); printArray(data,2000); startTime=(double)clock(); //quickSort(data,100); quickSortNonRecursion(data,2000); endTime=(double)clock(); printArray(data,2000); printf("Time:%fms",(endTime-startTime)); }