如何解决下面的python列表循环性能

jljoyd4f  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(337)

我在下面有一个python代码,它在100mil循环append中出现内存不足错误。具有相同代码的java在没有任何调优的情况下根本不存在这个问题。
无论如何,要使用python命令或类似javahotspot的jvm命令进行调优吗?
无论如何,要使用编码方式进行调优,使其运行更快,占用更少的内存。

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()更改为new date()并没有什么不同。

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) );

    }

}
qhhrdooz

qhhrdooz1#

因为表示unix历元时间戳的int比 datetime.datetime 物体

>>> sys.getsizeof(datetime.datetime.now())
48
>>> sys.getsizeof(time.time())
24

你可以这样做:

for _ in range(100000000):
    mylist.append(time.time())
h4cxqtbf

h4cxqtbf2#

你能用一个生成器表达式吗?您不能计算这样一个表达式的长度,因为值只在您迭代表达式时生成(因此内存需求非常低)。下面是一个演示:

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)

印刷品:

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() 当您需要一个新的值而不是在这个特殊情况下使用生成器表达式时。但是上面显示了生成器表达式在一般情况下的有用性。

相关问题