首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析下面的Python列表循环性能

如何解析下面的Python列表循环性能
EN

Stack Overflow用户
提问于 2020-11-23 14:39:00
回答 2查看 68关注 0票数 0

下面有一个Python代码,它为100 for循环追加了内存错误。代码相同的Java在没有任何调优的情况下根本没有这个问题。

无论如何,

  1. 可以使用python命令或类似于Java命令?

进行调优。

无论如何,

  1. 将使用编码方式进行调优,以使其运行得更快,并使用更少的内存。

代码语言:javascript
运行
复制
import datetime;

mylist = []

before = datetime.datetime.now()

for _ in range(100000000):
    mylist.append(datetime.datetime.now())

print("List length-->" , len(mylist))     
   
after = datetime.datetime.now()

print ('Python time taken in seconds--->', (after - before).seconds)

贴注:

这个"datetime.datetime.now()“上的内存泄漏检测

在这里分享我的java代码。如果不进行JVM优化,它的工作速度要快10倍以上,进程在大约6秒内完成。

无论如何,Java比Python做的垃圾收集工作要好得多。从20年前开始,Java通常不会在这种简单的操作中崩溃。https://www.snaplogic.com/glossary/python-vs-java-performance

注意:从System.currentTimeMillis()更改为Note()并没有什么不同。

代码语言:javascript
运行
复制
package demo;

import java.util.ArrayList;
import java.util.List;

public class Performance {

    public static void main(String[] args) {
        List<Long> mylist = new ArrayList<Long>();

        long before = System.currentTimeMillis();

        for (int i = 0; i < 100000000; i++) {
            mylist.add(System.currentTimeMillis());

        }

        long after = System.currentTimeMillis();
        System.out.println("Java time taken in miliseconds--->" + (after - before) );

    }

}
EN

回答 2

Stack Overflow用户

发布于 2020-11-23 15:13:23

你能用生成器表达式吗?不能使用这种表达式的长度,因为只有在遍历表达式时才生成值(因此内存需求非常低)。下面是一个演示:

代码语言:javascript
运行
复制
import datetime;
import time


before = datetime.datetime.now()
mylist = (datetime.datetime.now() for _ in range(100000000))
after = datetime.datetime.now()

# the following is problematic
#print("List length-->" , len(mylist))     
   
print ('Python time taken in seconds--->', (after - before).seconds)

#get first 5 datetimes:
n = 0
for dt in mylist:
    print(dt)
    n += 1
    if n == 5:
        break

#get next 5 datetimes with sleeping:
time.sleep(1)
n = 0
for dt in mylist:
    print(dt)
    n += 1
    if n == 5:
        break
    time.sleep(1)

指纹:

代码语言:javascript
运行
复制
Python time taken in seconds---> 0
2020-11-23 10:06:55.054316
2020-11-23 10:06:55.054316
2020-11-23 10:06:55.054316
2020-11-23 10:06:55.054316
2020-11-23 10:06:55.054316
2020-11-23 10:06:56.054372
2020-11-23 10:06:57.054869
2020-11-23 10:06:58.055935
2020-11-23 10:06:59.056067
2020-11-23 10:07:00.056201

当然,只要您想要一个新值,就可以直接调用datetime.datetime.now() ,而不是为使用生成器表达式--这个特殊情况是。但是,上面的这些说明了生成器表达式在一般情况下是有用的.。

票数 2
EN

Stack Overflow用户

发布于 2020-11-23 14:55:48

因为表示unix时代时间戳的int使用的内存比datetime.datetime对象少。

代码语言:javascript
运行
复制
>>> sys.getsizeof(datetime.datetime.now())
48
>>> sys.getsizeof(time.time())
24

你可以这样做:

代码语言:javascript
运行
复制
for _ in range(100000000):
    mylist.append(time.time())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64970546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档