GVKun编程网logo

为什么像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多?

3

本篇文章给大家谈谈为什么像Java、C、C++这样的静态语言会比Python、Ruby这样的动态语言流行得多?,同时本文还将给你拓展GoogleAppEngine:使用Docker的Flex环境中的P

本篇文章给大家谈谈为什么像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多?,同时本文还将给你拓展Google App Engine:使用 Docker 的 Flex 环境中的 Python 无法识别 JAVA 命令在此 Python 进程中找不到`java` 命令、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、Java, Python, Ruby, PHP, C等语言性能对比、java、ruby、python、php等如何生成excel文档?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

为什么像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多?

为什么像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多?

个人觉得像 Ruby 这样的动态语言简洁得多。

回复内容:

我觉得不应该看静态还是动态,而要看强类型和弱类型。
强类型比弱类型不容易出错,而弱类型只是省点代码而已。

python与php都是动态语言,但在python类型上比php严谨。举例如下:
<span>a</span> <span>=</span> <span>[</span><span>1</span><span>,</span> <span>2</span><span>,</span> <span>3</span><span>];</span>
<span>print</span><span>(</span><span>a</span><span>[</span><span>''1''</span><span>]);</span>
<span>b</span> <span>=</span> <span>{</span><span>0</span><span>:</span><span>1</span><span>,</span> <span>''a''</span><span>:</span><span>2</span><span>};</span>
<span>print</span><span>(</span><span>a</span><span>[</span><span>''0''</span><span>]);</span>
登录后复制
C/C++ 有强烈的学术背景,Java / C# 有强烈的商业背景,这些背景确保了有足够多的人和公司对这些语言有信心,从而促进了这些语言的大规模应用,之后就靠惯性了。
看看 Python 和 Ruby 在 web 开发领域成长速度就知道,在面对一个与人们熟悉的环境有所区别的问题的适合,人们才会重新开始审视自己手里的选择、放弃习惯而做出更合理的选择。 最关键的一点:国内大学没有Python和Ruby的课。 因为静态类型有利于工具做静态分析,有利于性能优化,有利于代码可读性
有些人总是拿完成同样任务所用代码量来做比较,得出python优于java的结论,不得不说这是非常片面的观点。
java是有些啰嗦,不过ide能帮忙减少80%以上的键盘敲击,同时静态分析能帮忙解决80%以上的低级错误,代码提示能帮忙减少80%以上的查文档时间,至于强大的重构能力更是python望尘莫及的,所以只要是稍微大的项目,用java很可能比python开发速度更快 1. 动态语言相对来说速度慢些.
2. 涉及到一些大的工程,Java/C/C++来说可以系统性的更准确高效的解决问题.
3. 当越到低层和硬件关系更近时, C/C++可以更好的完成任务.直接编译成机器语言.
而Python和Ruby需要运行环境.
当然, Python等动态语言用来做一个工具处理一些日常数据还是很好用的,
或者用Python Django做网站.

但一涉及到大型工程就需要用Java/C/C++了
比如嵌入式用C需要高效高性能, 网游用C++需要大量的绘图库及运算,
银行行业用J2EE, 安全性比较高, 并方便Unix上运行.
其实用的都不少, 差不多, 不同的语言工具有不同的特点解决不同的问题.
因为c、c++的历史长,本来出来就早,所以早就有了广泛应用。
而java,刚出来的时候有sun、IBM等等大厂在全力推广,推了十几年了,一直到现在。
ruby、python虽然出来也不算晚,但是没有大厂的商业推广,为大众熟知也是近十年的事情。 工具是用来解决问题的
能比较好的解决问题就可能被用的多
而不是说这个工具有多精致 越是复杂的项目,使用静态语言可以利用编译器更早的发现和避免问题。这并不是说动态语言并不能用于大型项目,但是在超过一定规模之后,动态语言轻便灵活的优势就会被重构时的overhead给抵消掉。

另一个原因是性能上的。同理,也不是动态语言写不出高效的代码,而是你花在优化上的时间会更多,而团队人多了水平难免参差不齐,不如静态语言稳妥。 我觉得动态语言查错比较困难,经常不知道错误在哪里,个人学PHP的亲身体会 这个问题如果放在几年前,估计就要倒过来问了......

哪个工具好,要看解决的问题是什么,最近什么技术流行,只能说明这个技术适用的问题域变成了普遍问题而已。

Google App Engine:使用 Docker 的 Flex 环境中的 Python 无法识别 JAVA 命令在此 Python 进程中找不到`java` 命令

Google App Engine:使用 Docker 的 Flex 环境中的 Python 无法识别 JAVA 命令在此 Python 进程中找不到`java` 命令

如何解决Google App Engine:使用 Docker 的 Flex 环境中的 Python 无法识别 JAVA 命令在此 Python 进程中找不到`java` 命令

我在 Google App Engine 上部署了一个 Python 项目。由于项目对Java有依赖,所以我使用了一个Docker容器,配置了两种环境:Python + Java。

但是,当我在 GAE 中调用我的 Python 服务时,它收到“在此 Python 进程中找不到“java 命令。请确保已安装 Java 并为 {{1} 设置了 PATH” }”错误

在 Docker 文件的构建过程中,我可以在安装后访问 Java。但是在 API 执行过程中,Python 无法识别。

使用的“app.yaml”文件:

  1. java

以下是 Deploy 中使用的 Docker 文件:

  1. runtime: custom
  2. env: flex
  3. entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker src.main:app

这是部署过程中 ### 1. Get Linux FROM alpine:3.7 # Default to UTF-8 file.encoding ENV LANG C.UTF-8 ### 2. Get Java via the package manager RUN apk update \\ && apk upgrade \\ && apk add --no-cache bash \\ && apk add --no-cache --virtual=build-dependencies unzip \\ && apk add --no-cache curl \\ && apk add --no-cache openjdk8-jre #### OPTIONAL : 4. SET JAVA_HOME environment variable,uncomment the line below if you need it ENV JAVA_HOME="/usr/lib/jvm/java-1.8-openjdk" RUN export JAVA_HOME ENV PATH $PATH:$JAVA_HOME/bin RUN export PATH RUN find / -name "java" RUN java -version FROM python:3.7 EXPOSE 8080 ENV APP_HOME /src workdir /src copY requirements.txt ./requirements.txt RUN pip3 install -r requirements.txt copY . /src CMD ["uvicorn","src.main:app","--host","0.0.0.0","--port","8080"] 命令的打印输出: RUN java -version command

有谁知道为什么即使在 App Engine 上的同一服务上运行 Python 和 Java 也会发生错误? 是否缺少任何其他设置?

解决方法

您在 Dockerfile 中使用了两个 FROM,因此您实际上是在执行 multi-stage Docker 构建,但您做错了。 多阶段构建应该是这样的:

  1. ### 1. Get Linux
  2. FROM alpine:3.7 as build
  3. # here you install with apk and build your Java program
  4. FROM python:3.7
  5. EXPOSE 8080
  6. ...
  7. # here you copy what you need from the previous Docker build,though
  8. # since it was Java,which is not installed here anymore because it is
  9. # a python image,you need to consider if you really need a multi-stage
  10. # build
  11. COPY --from=builder /src /src

否则,只需删除第二个 FROM python:3.7 并使用 apk 安装。

java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结

java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结

     

在 web 开发中,避免不了对日期的操作,就几种常见的日期操作做个总结 (部分参考网络,在此表示感谢):

java.util.Date、Java.util.Calendar、java.sql.Date、java.sql.Time、java.sql.Timestamp

 

java.lang.Object 
....|__java.util.Date 
..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

 

java.util.Date 日期格式为:年月日时分秒 
java.sql.Date 日期格式为:年月日 [只存储日期数据不存储时间数据] 
java.sql.Time 日期格式为:时分秒 
java.sql.Timestamp 日期格式为:年月日时分秒纳秒(毫微秒)

关系:

    java.util.Date 这个类是 java.sql.Date,  java.sql.Time,  java.slq.Timestamp 这三个类的父类。这三个类对 java.util.Date 类进行了包装。

联系:

    java.sql.Date 类屏蔽了 java.util.Date 类的时间有关的方法(形如:hh:mm:ss), 因此,不可以通过这个类访问时间有关的信息,比如,如果你通过 sqlDate.getHour () 方法去访问小时信息,此方法会抛出一个 IllegalArgumentException异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

    Java.sql.Time 类屏蔽了 java.util.Date 的日期有关的字段(形如:yyyy-MM-dd), 因此,不能通过这个类访问日期有关的信息,比如:如果你通过 sqlTime.getYear () 方法去获取年有关的信息,此方法会抛出一个 IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

  Java.sql.Timestamp字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过 getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1 秒等于十亿毫微秒),同样的,这也是为了和数据库中的 Timestamp 数据类型进行匹配。

理清了上述四个类的关系,那么 java.util.Date 和 java.util.Calendar 类有什么关系呢?

   Java.util.Calendar 类是 java.util.Date 类的一个更加深入,更加全面的替代。Java.util.Calendar 类支持 java.util.Date 的所有功能,此外,Calendar 还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar 还增加了比 Date 更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

 

注意:

Java.util.Calendar 区别与 java.util.Date 的几个地方也需要注意一下:首先,Calendar 增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而 java.util.Date 只是精确到秒。其次,Calendar 过去年的时候是当前年份比如:2010,而 Date 获取年份的时获取到的是当前年份 - 1900 的一个值(2010-1900=110,因此,你调用 getYear 后过去的值就是 110)。最后 Calendar 是一个抽象类,之所以能够实例化,是因为此处的 Calendar 充当了一个类似于工厂的作用,在 getInstance 方法中实例化了 Calendar 子类 GregorianCalendar,并把它返回给用户使用。

 

针对不同的数据库选用不同的日期类型 
・Oracle 的 Date 类型,只需要年月日,选择使用 java.sql.Date 类型 
・MS Sqlserver 数据库的 DateTime 类型,需要年月日时分秒,选择 java.sql.Timestamp 类型

 

String 日期格式转换成 Date 日期格式

//java.util.Date 时间格式的转换
    SimpleDateFormat f_utilDate=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  String str="2011-5-31 14:40:50";
  try {
   java.util.Date utilDate=f_utilDate.parse(str);
   System.out.println(f_utilDate.format(utilDate));
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

    //java.sql.Date 时间格式的转换
    SimpleDateFormat f_sqlDate=new SimpleDateFormat("yyyy-MM-dd");
    java.sql.Date sqlDate = java.sql.Date.valueOf("2010-08-20");
    System.out.println(f_sqlDate.format(sqlDate));
    
    //java.sql.Time sqltime 时间格式的转换
    SimpleDateFormat f_sqlTime=new SimpleDateFormat("hh:mm:ss");
    java.sql.Time sqltime = java.sql.Time.valueOf("13:44:53"); 
    System.out.println(f_sqlTime.format(sqltime));
    
    //java.sql.Timestamp 时间格式的转换
    SimpleDateFormat f_timestamp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2010-08-20 14:06:27.186"); 
    System.out.println(f_timestamp.format(timestamp));

 

 //java.util.Date 转换成 java.sql.Date 格式
       try{
        SimpleDateFormat DateFormate =   new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
               java.util.Date date1 = DateFormate.parse("2011-5-31 14:40:50");
               java.sql.Date sqlDate = new java.sql.Date(date1.getTime());
               System.out.println(DateFormate.format(sqlDate));
       }catch (Exception ex) {
            System.out.println(ex.getMessage());
       }

       //java.sql.Date 转换成 java.util.Date 格式
       java.sql.Date sqlDate1=java.sql.Date.valueOf("2005-12-12");
       java.util.Date utilDate1=new java.util.Date(sqlDate1.getTime());
       System.out.println ("java.sql.Date 转换成 java.util.Date 格式:"+f.format (utilDate1));

    //java.util.Date 转换 java.sql.Timestamp 
    new java.sql.Timestamp (new java.util.Date ().getTime ());// 此处 IDE 报错

    //java.util.Date 转换 java.sql.Time 
    new java.sql.Time(new java.util.Date().getTime());

    

    Timestamp timestamp  = new Timestamp(System.currentTimeMillis());

   我们可以使用 DateFormat 处理字符串来定义时间日期的格式 
   注:String 都是先转换为 java.util.Date,然后再转换成所需的格式

try{   
             String dateString = "2010-08-20 12:00:00.125";    
              DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd kk:mm:ss.SSS",Locale.ENGLISH);// 设定格式   
             dateFormat.setLenient(false);   
             java.util.Date utilDate = dateFormat.parse (dateString);//util 类型   
             java.sql.Timestamp dateTime = new java.sql.Timestamp (utilDate.getTime ());//Timestamp 类型,timeDate.getTime () 返回一个 long 型   
             System.out.println(dateTime);   
        }catch(Exception ex){   
            ex.printStackTrace();   
        }        

 

Java MySQL 数据类型对照

类型名称 显示长度 数据库类型 JAVA 类型 JDBC 类型索引 (int) 描述
           
VARCHAR L+N VARCHAR java.lang.String 12  
CHAR N CHAR java.lang.String 1  
BLOB L+N BLOB java.lang.byte[] -4  
TEXT 65535 VARCHAR java.lang.String -1  
           
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4  
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6  
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5  
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4  
BIT 1 BIT java.lang.Boolean -7  
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5  
FLOAT 4+8 FLOAT java.lang.Float 7  
DOUBLE 22 DOUBLE java.lang.Double 8  
DECIMAL 11 DECIMAL java.math.BigDecimal 3  
BOOLEAN 1 同 TINYINT      
           
ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4  
           
DATE 10 DATE java.sql.Date 91  
TIME 8 TIME java.sql.Time 92  
DATETIME 19 DATETIME java.sql.Timestamp 93  
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93  
YEAR 4 YEAR java.sql.Date 91





 

 

对于 bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在 java 中对应 byte[]数组。

 

对 Boolean 类型的解释

mysql 不支持 bool 类型。

1

2

3

4

5

create table xs

(

id int primary key,

bl boolean

)

这样可以创建成功,但检查表结构会发现 mysql 把它替换成 tinyint (1)。

即当把一个数据设置成 bool 类型的时候,数据库会自动转换成 tinyint (1) 的数据类型,其实这个就是变相的 bool。 默认值也就是 1,0 两种,分别对应了 bool 的 true 和 false

在 Java 对应的 POJO 类中,可以根据实际情况使用 java.lang.Boolean 或者 java.lang.Integer。

转自:

http://langgufu.iteye.com/blog/2202744

https://yq.aliyun.com/articles/38115

Java, Python, Ruby, PHP, C等语言性能对比

Java, Python, Ruby, PHP, C等语言性能对比

**代码功能:**循环拼接字符串,并替换子字符串

**硬件环境:**Intel Core2 Duo T7500@2.20Ghz CPU; 2 GB RAM; OS Debian GNU/Linux 2.6.32 i686

代码执行时长

代码运行时长

代码性能对比图 代码性能对比图

最慢: Java gcj (native executable)  
较慢: Java (openJDK); Java (Sun); Lua  
稍慢: tcl; Javascript (spidermonkey)  
较快: Python; Ruby; PHP; C++; Javascript V8; C; Perl5  
最快的是Perl,最慢的gcj,你能接受吗?

内存使用情况

内存使用情况

内存对比图: 内存对比图

测试源码:

C (source); Result: C gcc (Debian 4.4.4-1) 4.4.4

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(){

setbuf(stdout,NULL); //disable output buffering

char *str=malloc(8);
strcpy(str,"abcdefgh");

str=realloc(str,strlen(str)+8);
strcat(str,"efghefgh");     //sprintf(str,"%s%s",str,"efghefgh");

int imax=1024/strlen(str)*1024*4;

printf("%s","exec.tm.sec\tstr.length\n"); //fflush(stdout);

time_t starttime=time(NULL);
char *gstr=malloc(0);
int i=0;
char *pos;
int lngth;

char *pos_c=gstr;
int str_len=strlen(str);

    while(i++ < imax+1000){
        lngth=strlen(str)*i;
        gstr=realloc(gstr,lngth+str_len);
        strcat(gstr,str);    //sprintf(gstr,"%s%s",gstr,str);
        pos_c+=str_len;

        pos=gstr;
        while(pos=strstr(pos,"efgh")){
            memcpy(pos,"____",4);
        }

        if(lngth % (1024*256)==0){
            printf("%dsec\t\t%dkb\n",time(NULL)-starttime,lngth/1024); //fflush(stdout);
        }
    }
//printf("%s\n",gstr);

}

C++ (source) Result: C++ g++ (Debian 4.4.3-7) 4.4.3

#include <iostream>
#include <string>
#include <time.h>

using namespace std;

main ()
{
  string str = "abcdefgh";
    str += "efghefgh";
  int imax = 1024 /str.length() * 1024 *4;
  time_t currentTime = time(NULL);
  cout << "exec.tm.sec\tstr.length" << endl;

  string find= "efgh";
  string replace ="____";
  string gstr;
  int i=0;
  int length;
//  int end=0; //  size_t end=0;

  while(i++ < imax +1000){
    gstr += str;
    gstr = gstr;
    size_t start, sizeSearch=find.size(), end=0;

    while((start=gstr.find(find,end))!=string::npos){
        end=start+sizeSearch;
        gstr.replace(start,sizeSearch,replace);
    }
    length = str.length()*i;
    if((length%(1024 * 256))==0){
        cout << time(NULL) - currentTime << "sec\t\t" << length/1024 << "kb" <<  endl;
    }
  }
// cout << gstr << endl;

return 0;
}

Javascript (source); Results: Javascript (Spidermonkey - Mozilla) 1.8.0 pre-release 1 2007-10-03, Javascript (V8 - Chrome)

#!/usr/local/bin/js

var str = "abcdefgh"+"efghefgh";
var imax = 1024 / str.length * 1024 * 4;

var time = new Date();
print("exec.tm.sec\tstr.length");

var gstr = "";
var i=0;
var lngth;

while (i++ < imax+1000) {
    gstr += str;
    gstr = gstr.replace(/efgh/g, "____");
        lngth=str.length*i;
        if ((lngth % (1024*256)) == 0) {
                var curdate=new Date();
                print(parseInt(((curdate.getTime()-time.getTime())/1000))+"sec\t\t"+lngth/1024+"kb");
        }
}

Java (source) Results: Java (OpenJDK) "1.6.0 18", Java (Sun) "1.6.0 16", Java (gcj) (Debian 4.4.3-1) 4.4.3

public class java_test {

    public static final void main(String[] args) throws Exception {
        String str = "abcdefgh"+"efghefgh";
        int imax = 1024 / str.length() * 1024 * 4;

        long time = System.currentTimeMillis();
        System.out.println("exec.tm.sec\tstr.length\tallocated memory:free memory:memory used");
        Runtime runtime = Runtime.getRuntime();
        System.out.println("0\t\t0\t\t"+runtime.totalMemory()/1024 +":"+ runtime.freeMemory()/1024+":"+(runtime.totalMemory()-runtime.freeMemory())/1024);

        String gstr = "";
        int i=0;
        int lngth;

        while (i++ < imax+1000) {
            gstr += str;
            gstr = gstr.replaceAll("efgh", "____");
            lngth=str.length()*i;
                if ((lngth % (1024*256)) == 0) {
                        System.out.println(((System.currentTimeMillis()-time)/1000)+"sec\t\t"+lngth/1024+"kb\t\t"+runtime.totalMemory()/1024+":"+runtime.freeMemory()/1024+":"+(runtime.totalMemory()-runtime.freeMemory())/1024);
                }
        }
    }
}

Perl5 (source); Result: This is perl, v5.10.1

#!/usr/bin/perl
$|=1;    #disable output buffering, this is necessary for proper output through pipe

my $str=''abcdefgh''.''efghefgh'';
my $imax=1024/length($str)*1024*4;               # 4mb

my $starttime=time();
print "exec.tm.sec\tstr.length\n";

my $gstr='''';
my $i=0;

while($i++ < $imax+1000){   #adding 1000 iterations to delay exit. This will allow to capture memory usage on last step

        $gstr.=$str;
        $gstr=~s/efgh/____/g;
        my $lngth=length($str)*$i;   ##     my $lngth=length($gstr);        # Perhaps that would be a slower way
        print time()-$starttime,"sec\t\t",$lngth/1024,"kb\n" unless $lngth % (1024*256); #print out every 256kb
}

PHP (source); Result: PHP 5.3.1-5 with Suhosin-Patch (cgi-fcgi)

<?php


$str="abcdefgh"."efghefgh";
$imax=1024/strlen($str)*1024*4;      # 4mb

$starttime=time();
print("exec.tm.sec\tstr.length\n");

$gstr='''';
$i=0;

while($i++ < $imax+1000){

        $gstr.=$str;
        $gstr=preg_replace(''/efgh/'',''____'',$gstr);
        $lngth=strlen($str)*$i;
        if($lngth % (1024*256)==0){
                print (time()-$starttime."sec\t\t".($lngth/1024)."kb\n");
        }
}

?>

Python3 (source); Result: Python 3.1.3

#!/usr/bin/python3 -u
import re
import time
import sys

str=''abcdefgh''+''efghefgh''
imax=1024/len(str)*1024*4   # 4mb

starttime=time.time();
print "exec.tm.sec\tstr.length"
sys.stdout.flush()

gstr=''''
i=0

while (i < imax+1000):
        i=i+1
        gstr+=str
        gstr=re.sub(''efgh'',''____'',gstr)
        lngth=len(str)*i
        if(lngth % (1024*256) == 0):
                print int(time.time()-starttime),"sec\t\t",(lngth/1024),"kb"
                sys.stdout.flush()

Ruby (source); Result: ruby 1.8.7

#!/usr/bin/ruby
$stdout.sync=true;

str=''abcdefgh''+''efghefgh'';
imax=1024/str.length*1024*4;       # 4mb

starttime=Time.new;
print("exec.tm.sec\tstr.length\n");

gstr='''';
i=0;

while i < imax+1000
        i=i+1;
        gstr+=str;
        gstr=gstr.gsub(/efgh/, "____")

        lngth=str.length*i;
        if(lngth % (1024*256)==0)
                print(((Time.new-starttime).ceil).to_s+"sec\t\t",(lngth/1024).to_s,"kb\n");
        end
end

#puts gstr;

Lua (source); Result: Lua 5.1.4

#!/usr/bin/lua

io.stdout:setvbuf "no";             --  io.flush();

str=''abcdefgh''..''efghefgh'';
imax=1024/string.len(str)*1024*4;         -- 4mb

starttime=os.time();
print "exec.tm.sec\tstr.length";

gstr='''';
i=0;

while i < imax+1000 do
        i=i+1;
        gstr=gstr..str;
        gstr=string.gsub(gstr,"efgh","____");
        lngth=string.len(str)*i;
        if(math.mod(lngth,1024*256)==0) then
                print(os.time()-starttime.."sec\t\t"..(lngth/1024).."kb");
        end
end

tcl (source); Result: tcl 8.4.19

#!/usr/bin/tclsh

set str "abcdefgh"
append str "efghefgh"

set imax [expr {1024/[string length $str]*1024*4}]

set starttime [clock clicks -milliseconds]
puts "exec.tm.sec\tstr.length";

set gstr ""
set i 0

while {$i<[expr {$imax+1000}]} {
        incr i
        append gstr $str;
        regsub -all {efgh} $gstr ____ gstr
        set lngth [expr {[string length $str]*$i}]
        if {[expr {$lngth % (1024*256)}] == 0} {
                puts "[expr int([expr [clock clicks -milliseconds] - $starttime] / 1000)]sec\t\t[expr {$lngth/1024}]kb"
        }
}

exit

结论

各语言随着版本升级,也在不断优化,想要用好每个语言的特性,需要摸透她的脾气,这个需要不断的加深了解。

选语言就像选恋人,情人眼里出西施,你中意的,就是最好的,所以对以上结果别太较真。

java、ruby、python、php等如何生成excel文档?

java、ruby、python、php等如何生成excel文档?

excel在我们日常工作生活中会经常用到,通常我们都是用office软件去编写文档。但是对于格式一致的excel文档,如果还是使用人工完成,那绝不是我们软件工程师的姿态了~

下面我就介绍一种方法,不需要复杂的编程,任何编程语言都可使用~
调用别人封装好的API,只要能发送post请求就行,,,特别适合大规模生成相似文档的应用场合

API调用说明:https://www.xiaocongjisuan.com/show/api/44
API传参注意事项:

  1. appKey:接口唯一标识,在用户后台->应用中心->我的接口查看
  2. openId:平台id,注册后系统自动生成,在用户后台->用户中心->账户信息查看
  3. 表格内容是以json类型的字符串表示,只需要按照一定格式拼接字符串(集体规则查看api说明文档),然后调用api即可。

同时接口说明中也有各种开发语言的调用DEMO,如:java、python、php、c#、golang、nodeJS,其实不止上述这些语言,只要可以发出POST请求,就可以使用该接口,非常的方便。这个平台还有很多其它功能的接口,大部分是免费的。像什么天气预报、万年历、老黄历、中文分词、电影数据查询、电子书查询、网盘数据等等,大家慢慢去发现吧!下面贴一下文档内容提取的相关代码:

java版本:

package com.xiaocongjisuan.module.example;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class Application {
    
     public static final String DEF_CHATSET = "UTF-8";
     public static final int DEF_CONN_TIMEOUT = 30000;
     public static final int DEF_READ_TIMEOUT = 30000;
     public static String userAgent =  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
     
     //配置您申请的appKey和openId
     public static final String APP_KEY ="yours";
     public static final String OPEN_ID ="yours";
     
     //将map型转为请求参数型
     public static String urlEncode(Map<String,Object> params) {
        
        if(params==null){return "";};
         
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String,Object> i : params.entrySet()) {
            try {
                sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        String r=sb.toString();
        if(r.endsWith("&")){
            r = r.substring(0,r.length()-1);
        }
        return r;
     }
     
     /**
     *
     * @param requestUrl 请求地址
     * @param params 请求参数
     * @param method 请求方法
     * @return 请求结果
     * @throws Exception
     */
     public static String requestContent(String requestUrl, Map<String,Object> params,String method) throws Exception {
        
        HttpURLConnection conn = null;
        BufferedReader reader = null;
        String rs = null;
        try {

            //组装请求链接
            StringBuffer sb = new StringBuffer();
            
            if(method!=null&&method.equalsIgnoreCase("get")){
                requestUrl = requestUrl+"?"+urlEncode(params);
            }

            //默认get
            URL url = new URL(requestUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            
            if(method!=null&&method.equalsIgnoreCase("post")){
                 conn.setRequestMethod("POST");
                 conn.setDoOutput(true);
                 conn.setDoInput(true);
            }

            //参数配置
            conn.setRequestProperty("User-agent", userAgent);
            conn.setUseCaches(false);
            conn.setConnectTimeout(DEF_CONN_TIMEOUT);
            conn.setReadTimeout(DEF_READ_TIMEOUT);
            conn.setInstanceFollowRedirects(false);
            conn.connect();
            
            if (params!= null && method.equalsIgnoreCase("post")) {
                try {
                    DataOutputStream out = new DataOutputStream(conn.getOutputStream());
                    out.writeBytes(urlEncode(params));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
            //读取数据
            InputStream is = conn.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sb.append(strRead);
            }
            rs = sb.toString();
            
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
            if (conn != null) {
                conn.disconnect();
            }
        }
        return rs;
    }
    
    
    public static void main(String[] args) throws Exception{
        
        String domain="http://api.xiaocongjisuan.com/";
        String servlet="develop/officeexcelgenerate/get";
        String method="get";
        
        String requestUrl=domain+servlet;
        Map<String,Object> params=new HashMap<String,Object>();
        params.put("appKey",APP_KEY);
        params.put("openId",OPEN_ID);

        //变动部分
        params.put("toFormat","xlsx");
        params.put("content","{\"sheets\":[{\"header\":[\"姓名\",\"性别\",\"年龄\"],\"rows\":[[\"张三\",\"男\",\"25\"],[\"李四\",\"男\",\"20\"],[\"小红\",\"女\",\"21\"]]},{\"header\":[\"姓名\",\"成绩\"],\"rows\":[[\"张三\",25],[\"李四\",20],[\"小红\",21]]}]}");
        
        String result=requestContent(requestUrl,params,method);
        System.out.println(result);
    }
}

python版本:

# -*- coding: utf-8 -*-
# flake8: noqa
__author__ = ''wukong''

import urllib
from urllib import urlencode

#配置您申请的appKey和openId
app_key="***"
open_id="***"

"""
request_url 请求地址
params 请求参数
method 请求方法

"""
def request_content(request_url,params,method):
    params = urlencode(params)
    
    if method and method.lower() =="get":
        f = urllib.urlopen("%s?%s" % (request_url, params))
    else:
        f = urllib.urlopen(request_url, params)
 
    content = f.read()
    print content

   
def main():
    
    domain="http://127.0.0.1:8080/xiaocongjisuan/"
    servlet="develop/officeexcelgenerate/get"
    method="post"
    request_url=domain+servlet
    
    #字典
    params ={}
    
    params["docName"]=app_key
    params["openId"]=open_id
    
    #变动部分
    params["toFormat"]="xlsx"
    params["content"]="{\"sheets\":[{\"header\":[\"姓名\",\"性别\",\"年龄\"],\"rows\":[[\"张三\",\"男\",\"25\"],[\"李四\",\"男\",\"20\"],[\"小红\",\"女\",\"21\"]]},{\"header\":[\"姓名\",\"成绩\"],\"rows\":[[\"张三\",25],[\"李四\",20],[\"小红\",21]]}]}"


    request_content(request_url,params,method)
    
if __name__ == ''__main__'':
    main()

php版本:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<?php

/**
 * @author 
 * @copyright 2019
 */
 
header("content-type:text/html;charset=utf-8");         //设置编码
 
//配置您申请的appKey和openId
$app_key = "***";
$open_id = "***";

/**
$url 请求地址
$params 请求参数
$ispost 请求方法
*/

function http_curl($url,$params=false,$ispost=false){
   
    $httpInfo = array();
    $ch = curl_init();

    curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
    curl_setopt( $ch, CURLOPT_USERAGENT , "xiaocongjisuan");
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
    curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
    
    if( $ispost )
    {
        curl_setopt( $ch , CURLOPT_POST , true );
        curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
        curl_setopt( $ch , CURLOPT_URL , $url );
    }
    else
    {
        if($params){
            curl_setopt( $ch , CURLOPT_URL , $url.''?''.$params );
        }else{
            curl_setopt( $ch , CURLOPT_URL , $url);
        }
    }
    
    $response = curl_exec( $ch );
    if ($response === FALSE) {
        //echo "cURL Error: " . curl_error($ch);
        return false;
    }
    $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
    $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
    curl_close( $ch );
    
    return $response;
}

function main(){
    
    global $app_key;
    global $open_id;
    
    $domain="http://api.xiaocongjisuan.com/";
    $servlet="develop/officeexcelgenerate/get";
    $method="get";
    
    $url=$domain."".$servlet;
    
    $params[''appKey'']=$app_key;
    $params[''openId'']=$open_id;
    
    //变动部分
    $params["toFormat"]="xlsx";
    $params["content"]="{\"sheets\":[{\"header\":[\"姓名\",\"性别\",\"年龄\"],\"rows\":[[\"张三\",\"男\",\"25\"],[\"李四\",\"男\",\"20\"],[\"小红\",\"女\",\"21\"]]},{\"header\":[\"姓名\",\"成绩\"],\"rows\":[[\"张三\",25],[\"李四\",20],[\"小红\",21]]}]}";

    //编码转换
    foreach ($params as $key=>$value) {
        $params[$key]=mb_convert_encoding($value, "UTF-8", "GBK");
    }

    $paramstring = http_build_query($params);
    $content = http_curl($url,$paramstring,true);
    
    return $content;
}

echo main();
?>

等等.....,其它语言,请看说明文档

我们今天的关于为什么像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多?的分享就到这里,谢谢您的阅读,如果想了解更多关于Google App Engine:使用 Docker 的 Flex 环境中的 Python 无法识别 JAVA 命令在此 Python 进程中找不到`java` 命令、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、Java, Python, Ruby, PHP, C等语言性能对比、java、ruby、python、php等如何生成excel文档?的相关信息,可以在本站进行搜索。

本文标签: