下面有一个Python代码,它为100 for循环追加了内存错误。代码相同的Java在没有任何调优的情况下根本没有这个问题。
无论如何,
进行调优。
无论如何,
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()并没有什么不同。
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) );
}
}
发布于 2020-11-23 15:13:23
你能用生成器表达式吗?不能使用这种表达式的长度,因为只有在遍历表达式时才生成值(因此内存需求非常低)。下面是一个演示:
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()
,而不是为使用生成器表达式--这个特殊情况是。但是,上面的这些说明了生成器表达式在一般情况下是有用的.。
发布于 2020-11-23 14:55:48
因为表示unix时代时间戳的int使用的内存比datetime.datetime
对象少。
>>> sys.getsizeof(datetime.datetime.now())
48
>>> sys.getsizeof(time.time())
24
你可以这样做:
for _ in range(100000000):
mylist.append(time.time())
https://stackoverflow.com/questions/64970546
复制相似问题