列表理解中的计算时间有问题。在解决问题时,我发现:
In [209]: now = datetime.datetime.now()
...: for i in range(15):
...: k = [0 for j in range(100000)]
...: print(datetime.datetime.now() - now)
...:
0:00:00.004146
0:00:00.007886
0:00:00.011533
0:00:00.015274
0:00:00.019104
0:00:00.022788
0:00:00.026528
0:00:00.030252
0:00:00.033969
0:00:00.037713
0:00:00.041409
0:00:00.045144
0:00:00.048842
0:00:00.052526
0:00:00.056224
没问题:列表理解很快。现在,如果我们创建int ...
列表,而不是创建intIn [211]: now = datetime.datetime.now()
...: for i in range(15):
...: k = [[0] for j in range(100000)]
...: print(datetime.datetime.now() - now)
...:
0:00:00.047167
0:00:00.107979
0:00:00.170456
0:00:00.231888
0:00:00.293667
0:00:00.354984
0:00:06.686698 <=== Taking much more time
0:00:06.747476
0:00:06.811326
0:00:06.874809
0:00:06.937590
0:00:06.998185
0:00:07.068399
0:00:13.449616 <=== Taking much more time
0:00:13.511518
看起来python需要每X次迭代执行一些操作。这项操作需要花费很多时间。
我认为它与内存分配等有关,但如果有人知道为什么要解释它,我就会感兴趣!
谢谢。
编辑:更多信息:我在tpyux会话中遇到问题,在ipython上。如果我打开一个新的tmux窗口,在ipython上问题不存在...... 所以看起来这个问题与特定的开放式tmux窗口相关联?如果你们中的一些人想尝试一些事情,我仍然有开放的会议......
所以我们说这只是腐败或有什么东西吗?
答案 0 :(得分:0)
您的测量方法不准确 - 您在函数调用中有大量开销,而print
执行时间会因执行系统调用而有所不同。要获得更好的结果,请尝试以下方法:
import timeit
int_res = [timeit.timeit('[0 for i in x]', setup="x = range(100000)", number=1) for i in range(1000)]
list_res = [timeit.timeit('[[0] for i in x]', setup="x = range(100000)", number=1) for i in range(1000)]
print("Ints:", min(int_res), max(int_res))
print("Lists:", min(list_res), max(list_res))
输出:
Ints: 0.004607329028658569 0.04245903599075973
Lists: 0.015519230044446886 0.1320938270073384
如您所见,两种方法都表现出完全相同的行为。
然后,我试图检验垃圾收集器的假设。我做了以下事情:
import timeit
import gc
int_res = [timeit.timeit('[0 for i in x]', setup="x = range(100000); gc.collect()", number=1) for i in range(1000)]
list_res = [timeit.timeit('[[0] for i in x]', setup="x = range(100000); gc.collect()", number=1) for i in range(1000)]
print("Ints:", min(int_res), max(int_res))
print("Lists:", min(list_res), max(list_res))
输出:
Ints: 0.004779412993229926 0.02010424993932247
Lists: 0.015465378062799573 0.03042234410531819
此处,setup=
部分未经测量且无效。每个测量都使用timeit
函数执行,然后记住。