本篇文章给大家谈谈为什么像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 这样的动态语言流行得多?
- 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 这样的动态语言流行得多?
个人觉得像 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>
看看 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 上部署了一个 Python 项目。由于项目对Java有依赖,所以我使用了一个Docker容器,配置了两种环境:Python + Java。
但是,当我在 GAE 中调用我的 Python 服务时,它收到“在此 Python 进程中找不到“java
命令。请确保已安装 Java 并为 {{1} 设置了 PATH” }”错误。
在 Docker 文件的构建过程中,我可以在安装后访问 Java。但是在 API 执行过程中,Python 无法识别。
使用的“app.yaml”文件:
java
以下是 Deploy 中使用的 Docker 文件:
runtime: custom
env: flex
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. Get Linux
FROM alpine:3.7 as build
# here you install with apk and build your Java program
FROM python:3.7
EXPOSE 8080
...
# here you copy what you need from the previous Docker build,though
# since it was Java,which is not installed here anymore because it is
# a python image,you need to consider if you really need a multi-stage
# build
COPY --from=builder /src /src
否则,只需删除第二个 FROM python:3.7
并使用 apk 安装。
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 |
|
这样可以创建成功,但检查表结构会发现 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等语言性能对比
**代码功能:**循环拼接字符串,并替换子字符串
**硬件环境:**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文档?
excel在我们日常工作生活中会经常用到,通常我们都是用office软件去编写文档。但是对于格式一致的excel文档,如果还是使用人工完成,那绝不是我们软件工程师的姿态了~
下面我就介绍一种方法,不需要复杂的编程,任何编程语言都可使用~
调用别人封装好的API,只要能发送post请求就行,,,特别适合大规模生成相似文档的应用场合
API调用说明:https://www.xiaocongjisuan.com/show/api/44
API传参注意事项:
- appKey:接口唯一标识,在用户后台->应用中心->我的接口查看
- openId:平台id,注册后系统自动生成,在用户后台->用户中心->账户信息查看
- 表格内容是以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文档?的相关信息,可以在本站进行搜索。
本文标签: