找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4245|回复: 7

[已解决] for循环运行时间

1

主题

4

帖子

4

积分

贫民

积分
4
gogo 发表于 2017-11-22 11:59:38 | 显示全部楼层 |阅读模式
各位大侠。本人在运行for循环时有以下疑问,请各位给予解惑,谢谢。
在Java中下面这个循环不到1秒就结束,而在Python中需要好几分钟,为什么,Python中的如何优化才能减少时间?
Java中程序:
                int s = 0;
                for(int i=1;i<80000;i++){
                        //System.out.println(i);
                        for(int j=0;j<i;j++){
                                s = i+j;
                        }
                }



Python中程序:
p=0
for i in range(1,80000):   
    for j in range(0,i):
       p= i + j

回复

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-22 13:16:28 | 显示全部楼层
时间复杂度O(n^2), 2w数据量就得超过1秒了,何况8w,你java中估计没用到s,编译器自动优化了吧,你在java里试试这个,估计也得好几分钟
int s = 0;
int max = 0;
for(int i=1;i<80000;i++){
    //System.out.println(i);
    for(int j=0;j<i;j++){
        s = i+j;
        if(s > max)max=s;
    }
}
回复 支持 1 反对 0

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
gogo  楼主| 发表于 2017-11-22 13:58:38 | 显示全部楼层
剑心无痕 发表于 2017-11-22 13:16
时间复杂度O(n^2), 2w数据量就得超过1秒了,何况8w,你java中估计没用到s,编译器自动优化了吧,你在java ...

谢谢你,我试了下,也就1s。
关键是我上面那个Java与Python的程序功能是一样的。
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-22 14:56:33 | 显示全部楼层
gogo 发表于 2017-11-22 13:58
谢谢你,我试了下,也就1s。
关键是我上面那个Java与Python的程序功能是一样的。 ...

java是静态语言,在运行前需要编译成2进制机器码,编译的过程会把无关变量优化掉,python是动态语言,你写的是什么他就执行什么
int s = 0;
for(int i=1;i<80000;i++){
    //System.out.println(i);
    for(int j=0;j<i;j++){
        s = i+j;
    }
}
System.out.println(s);
你在试试这个,你的java肯定把这两重循环优化了,你可以在调试java时的汇编程序里面看,如果跑这两重循环肯定超1s
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
gogo  楼主| 发表于 2017-11-22 15:02:02 | 显示全部楼层
剑心无痕 发表于 2017-11-22 14:56
java是静态语言,在运行前需要编译成2进制机器码,编译的过程会把无关变量优化掉,python是动态语言,你写 ...

再次谢谢,那怎么能够优化一下Python的循环,让速度快一点。
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-22 15:09:09 | 显示全部楼层
gogo 发表于 2017-11-22 15:02
再次谢谢,那怎么能够优化一下Python的循环,让速度快一点。

额。。我觉得你应该去优化你的算法,而不是去优化循环,因为一门语言经过长久的发展,本身已经做了足够多的优化了,而你要实现的需求并不一定需要用n^2的时间复杂度,nlogn的复杂度就能大大降低你的时间,你可以把你的需求说明一下
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-22 15:50:20 | 显示全部楼层
gogo 发表于 2017-11-22 15:02
再次谢谢,那怎么能够优化一下Python的循环,让速度快一点。

为了防止优化器优化
class MainDemo
{
    public static void main(String[] args)
    {
        int s = 0;
        long start=System.currentTimeMillis();   //获取开始时间
        for(int i=1;i<2000;i++){
        //System.out.println(i);
            for(int j=0;j<i;j++){
                s = i+j;
                System.out.println(i);
            }
        }
        long end=System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间: "+(end-start)+"ms");
    }
}
程序运行时间: 18371ms

python的
import time
start = time.time()
p = 0
for i in range(1, 2000):
    for j in range(i):
        p = i + j
        print(p)
end = time.time()
print("程序运行时间: "+(end-start)+"s")
程序运行时间: 37.228148460388184s
都打印出来java就不能把循环优化掉了,才执行2000次循环java都要18s。但是这样还是不公平,因为java在运行程序之前还要用javac编译一下,这个时间虽然不到一秒,但是这是静态语言和动态语言最大的差距
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
gogo  楼主| 发表于 2017-11-22 18:40:32 | 显示全部楼层
剑心无痕 发表于 2017-11-22 15:50
为了防止优化器优化
class MainDemo
{

还真是,明白了。解释比较透彻,醍醐灌顶!非常感谢!!!!!这么耐心的给予解答。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表